我试图理解 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,两者的结果与上述完全相同。
Update:显然,只有 start 才会产生一个新进程,随后将调用 run 。然后我的实际问题转化为以下问题:如何将 l 传递给生成的进程 s.t.我可以看到实际结果吗?
Solution:以下示例展示了如何将共享数据安全地传递给进程:
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)
进一步阅读:多处理管理器文档 https://docs.python.org/2/library/multiprocessing.html#multiprocessing-managers