多处理事件不起作用
问题内容:
我已经使用多处理模块在Python 3中编写了以下代码。更多有关如何使用的测试脚本Event
。但是,它不起作用。
import multiprocessing, time
from multiprocessing import Process, Event
event = Event()
def f(n):
if n == 1:
print("starting")
event.wait()
print("Done!")
if n == 2:
time.sleep(3)
event.set()
print("setting")
if __name__ == "__main__":
p1 = Process(target = f, args = (1,))
p2 = Process(target = f, args = (2,))
p1.start()
p2.start()
time.sleep(1000)
但是,当我运行此命令时,我只会得到输出:
starting
setting
我想获得输出:
starting
setting
Done!
但是由于某种原因,在p1
流程调用event.set()之后,流程无法继续执行其代码p2
。
任何想法为什么会这样?
问题答案:
明确地将资源传递给子进程
…最好将对象作为参数传递给子进程的构造函数。
除了使代码(潜在地)与Windows兼容之外,还…
在Windows上,您需要将共享对象传递给Process
参数的构造函数列表。否则,子进程将获得一个全新的副本,而不是父进程的副本。这就是f(1)
挂起的原因,它正在等待另一个Event
对象。
只需像这样更改代码。
def f(n, event):
if n == 1:
print("starting")
event.wait()
print("Done!")
elif n == 2:
time.sleep(3)
event.set()
print("setting")
if __name__ == "__main__":
event = Event() # one instance of Event only
p1 = Process(target = f, args = (1, event))
p2 = Process(target = f, args = (2, event))
p1.start()
p2.start()
p1.join()
p2.join()