Python多处理apply_async在启动子进程的主进程中读/写var

时间:2015-11-12 13:05:27

标签: python python-multiprocessing

我正在使用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的好方法?感谢。

1 个答案:

答案 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似乎并不容易处理。