代码之家  ›  专栏  ›  技术社区  ›  Anish Shanbhag

多处理事件不工作

  •  4
  • Anish Shanbhag  · 技术社区  · 7 年前

    我使用多处理模块在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 事件发生后,进程没有继续使用其代码。set()已被 p2 过程

    你知道为什么会这样吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   noxdafox    7 年前

    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()