[英]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.