繁体   English   中英

Python multiprocessing.Process:从局部变量开始

[英]Python multiprocessing.Process: start with local variable

我试图理解multiprocessing.Process类。 我想收集异步存储在某处的数据。 存储数据后,它会以某种方式丢失。 这是我的MWE:

from __future__ import print_function
import multiprocessing as mp

def append_test(tgt):
    tgt.append(42)
    print('Appended:', tgt)

l = []
p = mp.Process(target=lambda: append_test(l))

p.run()
print('l is', l)

p.start()
p.join()
print('l is', l)

如果我正在运行该代码段,我会得到

Appended: [42]
l is [42]
Appended: [42, 42]
l is [42]

如您所见,调用run和使用start / join之间有区别。 它与订单无关(以后使用运行)-我已经尝试过了。 有人可以详细说明第二个42如何丢失吗? 它似乎存储在某个时间? 但是在其他时候,它绝对不是。

以防万一可能会有所不同:我已经尝试了python2.7和python3.4,两者的结果完全相同。


更新 :显然只有启动会产生一个新进程,此后将调用运行。 然后,我的实际问题转化为以下问题:如何将l传递给生成的进程,以便可以看到实际结果?


解决方案 :以下示例显示如何将共享数据安全地传递到流程:

from __future__ import print_function
import multiprocessing as mp

def append_test(tgt):
    tgt.append(42)
    print('Appended:', tgt)

m = mp.Manager()
l = m.list()
p = mp.Process(target=lambda: append_test(l))

p.start()
p.join()
print('l is', l)

进一步阅读: Multiprocessing Managers文档

运行将执行您在多处理中定位的可调用对象。 Start将调用该对象的run()方法。

来自多重处理的文档

run()表示流程活动的方法。

您可以在子类中重写此方法。 标准的run()方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),并分别从args和kwargs参数中获取顺序参数和关键字参数。

start()启动流程的活动。

每个过程对象最多只能调用一次。 它安排在单独的进程中调用对象的run()方法。

来自Python:Beazley的基本参考:

p.run():进程启动时运行的方法。 默认情况下,这将调用传递给Process构造函数的目标。 ...

p.start():启动进程。 这将启动代表该流程的子流程,并在该子流程中调用p.run()。

因此,它们并不是要做同样的事情。 在我看来,在这种情况下,正在运行的进程将调用p.run(),而p.start()在新进程中调用p.run(),并将原始目标传递给构造函数(在该进程中l仍然是[]。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM