Ani*_*hag 5 python events multiprocessing
我使用多处理模块在 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)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个时,我只得到输出:
starting
setting
Run Code Online (Sandbox Code Playgroud)
我想得到输出:
starting
setting
Done!
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,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()
Run Code Online (Sandbox Code Playgroud)