【问题标题】:Python multiprocessing apply_async read/write var in main process at starting subprocessPython multiprocessing apply_async read/write var in main process at start subprocess
【发布时间】:2015-11-12 13:05:27
【问题描述】:

我正在使用 Python 3.5 多处理 apply_async。我的代码就像task = pool.apply_async(myFunc, args)。我在 args 中传递了一个信息(来自 Info 的对象)。它有一个名为 startTime 的数据成员。我希望当 myFunc 开始运行时,info.startTime 会写成time.time()。问题是主进程中的信息和子进程中的信息不一样。 myFunc 中的info.startTime = time.time() 不会更改主进程中的信息。有没有保存startTime的好方法?谢谢。

【问题讨论】:

  • 返回info 以便您可以使用info = task.get() 访问它怎么样?
  • 查看Sharing state between processes 了解一些解决方案
  • @Vincent 希望能在子进程返回前得到开始时间。
  • @AndreaCorbellini 非常感谢!我试试看

标签: python python-multiprocessing


【解决方案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(),您会发现它不再有效。

附:当您使用Pool 时,Queue 似乎并不容易处理。

【讨论】:

  • 谢谢!我使用 multiprocessing.Manager 完成了该功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-27
  • 2018-01-24
相关资源
最近更新 更多