【问题标题】:Multiprocessing Event not Working多处理事件不起作用
【发布时间】:2018-04-22 00:45:19
【问题描述】:

我使用多处理模块在 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 进程在p2 进程调用 event.set() 后并未继续执行其代码。

任何想法为什么会发生这种情况?

【问题讨论】:

  • 我在本地测试,它确实有效,你使用的是哪个操作系统平台?是 Windows 吗?
  • 我又试了一次还是不行!我让它工作了一次,但它不再工作了。我在 Windows 上。任何想法为什么会发生这种情况?
  • 我正在回答这个问题,但你取消了它...让我再试一次。

标签: python events multiprocessing


【解决方案1】:

来自multiprocessing programming guidelines

将资源显式传递给子进程

...最好将对象作为参数传递给子进程的构造函数。

除了使代码(可能)与 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2012-01-26
    相关资源
    最近更新 更多