gpt4 book ai didi

Python多处理.进程: start with local variable

转载 作者:行者123 更新时间:2023-12-02 02:26:16 25 4
gpt4 key购买 nike

我试图理解 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,两者的结果与上述完全相同。

<小时/>

更新:显然,只有 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

最佳答案

来自 Python:Beazley 的基本引用:

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

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

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

关于Python多处理.进程: start with local variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com