Python multiprocessing.Process: start with local variable(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:从局部变量开始的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python多处理.Process:从局部变量开始
基础教程推荐
- 症状类型错误:无法确定关系的真值 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01