我正在尝试使用一个部分函数,以便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.
我错过了什么?如何在子进程之间共享锁?
对不起,我应该在回答你的另一个问题时注意到这一点。不能将普通的} 并传递^{} :
multiprocessing.Lock
对象传递给Pool
方法,因为它们不能被pickle。有两种方法可以解决这个问题。一个是创建^{不过,这有点沉重;使用
Manager
需要生成另一个进程来托管Manager
服务器。所有对acquire
/release
锁的调用都必须通过IPC发送到该服务器。另一个选项是在创建池时使用
initializer
kwarg传递常规的multiprocessing.Lock()
。这将使您的锁实例在所有子工作进程中都是全局的:第二种解决方案的副作用是不再需要
partial
。这里有一个版本(使用
Barrier
而不是Lock
,但您可以理解),它也可以在Windows上工作(其中缺少的fork
会导致其他问题):相关问题 更多 >
编程相关推荐