Python在进程之间共享一个锁
我正在尝试使用部分函数,以便pool.map()可以定位一个具有多个参数的函数(在本例中为Lock()对象)。
以下是示例代码(摘自对我的上一个问题的回答):
from functools import partial def target(lock, iterable_item): for item in items: # Do cool stuff if (... some condition here ...): lock.acquire() # Write to stdout or logfile, etc. lock.release() def main(): iterable = [1, 2, 3, 4, 5] pool = multiprocessing.Pool() l = multiprocessing.Lock() func = partial(target, l) pool.map(func, iterable) pool.close() pool.join()
但是,当我运行这个代码,我得到的错误:
Runtime Error: Lock objects should only be shared between processes through inheritance.
我在这里错过了什么? 我怎样才能分享我的subprocess之间的锁?
对不起,我应该回答你的其他问题。 您无法将正常的multiprocessing.Lock
对象传递给Pool
方法,因为它们不能被腌制。 有两种方法可以解决这个问题。 一个是创buildManager()
并传递一个Manager.Lock()
:
def main(): iterable = [1, 2, 3, 4, 5] pool = multiprocessing.Pool() m = multiprocessing.Manager() l = m.Lock() func = partial(target, l) pool.map(func, iterable) pool.close() pool.join()
虽然这有点重量级, 使用Manager
需要产生另一个进程来托pipeManager
服务器。 所有acquire
/ release
锁的呼叫都必须通过IPC发送到该服务器。
另一个select是在池创build时使用initializer
kwarg传递常规multiprocessing.Lock()
。 这将使你的锁实例在所有的童工中是全局的:
def target(iterable_item): for item in items: # Do cool stuff if (... some condition here ...): lock.acquire() # Write to stdout or logfile, etc. lock.release() def init(l): global lock lock = l def main(): iterable = [1, 2, 3, 4, 5] l = multiprocessing.Lock() pool = multiprocessing.Pool(initializer=init, initargs=(l,)) pool.map(target, iterable) pool.close() pool.join()
第二个解决scheme的副作用不再需要partial
。