多处理事件不起作用


问题内容

我已经使用多处理模块在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()