我试图通过传递 Manager.dict 来捕获每个进程的开始和结束时间。当我使用fun 时,它没有按预期工作,但对于fun_1 来说,它工作正常。我在 python 3.7 (IDE VS Code) 上运行此代码
import time
from multiprocessing import Manager
from multiprocessing.pool import Pool
def fun(a, d):
if a not in d:
d[a] = list()
d[a].append(time.time())
time.sleep(1)
d[a].append(time.time())
def fun_1(a, d):
s = time.time()
time.sleep(1)
e = time.time()
d[a] = [s, e]
if __name__ == '__main__':
pool = Pool(4)
m = Manager()
d = m.dict()
pool.starmap(fun, [(i, d) for i in range(10)])
print(d) # {3: [], 0: [], 2: [], 1: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}
看起来我错过了一些东西。提前致谢
该线程解释了您的问题:https : //bugs.python.org/issue36119
作为解决此问题的一种方法,您应该执行一项__setitem__
操作,允许系统注意到传播到共享管理器对象的对象中的更改。这就是为什么您的 fun_1 确实可以作为您的表演d[a] = [s,e]
。
另一种选择是您可以预定义 manager.list() 对象而不是正常的列表对象,这些对象在这种情况下应该按照您期望的方式执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句