Python多处理.Process:从局部变量开始 [英] Python multiprocessing.Process: start with local variable

查看:10
本文介绍了Python多处理.Process:从局部变量开始的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试理解多进程.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,两者的结果都与上面描述的完全相同。


更新:显然只有Start会生成一个新进程,随后将调用Run。然后,我的实际问题转化为以下问题:如何将l传递给派生的进程s.t。我能看到实际结果吗?


解决方案:以下示例说明如何将共享数据安全传递到进程:

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 Documentation

推荐答案

摘自:Beazley的基本参考:

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

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

因此,他们不应该做同样的事情。在我看来,在本例中,p.run()是为正在进行的进程调用的,p.start()在一个新进程中调用p.run(),该新进程带有传递给构造函数的原始目标(其中l仍然是[])。

这篇关于Python多处理.Process:从局部变量开始的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆