我使用多处理模块在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
进程调用后没有继续其代码。
知道为什么会这样吗?
来自multiprocessing
编程指南。
将资源显式传递给子进程
。最好将对象作为参数传递给子进程的构造函数。
除了使代码(可能)与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()