多处理事件不起作用

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

有什么想法为什么会发生这种情况吗?

nox*_*fox 6

来自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()
Run Code Online (Sandbox Code Playgroud)