我正在使用Python 3.5多处理apply_async。我的代码就像task = pool.apply_async(myFunc, args)
。我在args中传递了一个info(来自Info的对象)。它有一个名为startTime的数据成员。我希望当myFunc开始运行时,info.startTime
将被写为time.time()
。问题是主进程中的信息和子进程中的信息不一样。 myFunc中的info.startTime = time.time()
不会更改主进程中的信息。有没有一种保存startTime的好方法?感谢。
答案 0 :(得分:1)
池中的进程无法写入公共变量。将它们视为并行宇宙中的存在。您需要一些机制来在它们之间共享信息。这是一个使用Manager
来保留所有进程的时间戳的简单示例:
from multiprocessing import Pool, Manager, current_process
import time
def do_work(x, ll):
time.sleep(.2)
ll.append(current_process().name + ' took task '+str(x)+' at '+str(time.time()))
if __name__ == '__main__':
with Manager() as manager:
timestamp = manager.list()
p = Pool(processes=4)
for x in range(10):
p.apply_async(do_work, (x, timestamp))
p.close()
p.join()
print(timestamp)
如果您将timestamp = manager.list()
更改为timestamp = list()
,则会发现它不再有效。
P.S。当您使用Queue
时,Pool
似乎并不容易处理。