多处理队列需要管理器吗?

时间:2017-07-27 09:35:05

标签: python parallel-processing queue multiprocessing deadlock

为什么编程死锁但程序B运行正常?

两者都使用队列在主进程和子进程之间传递结果。在从队列中检索结果之前,两者都等待所有子进程结束。

在实际程序中,我需要一个队列来在步骤之间传递结果流。这是为了在生成结果时以及在其中一个步骤完成之前处理结果。

将程序A中的mp.queue更改为mp.Manager的队列将解决死锁问题。但是使用经理似乎会有性能损失,因为经理是由主流程管理的。

程序A(没有经理的死锁):

import multiprocessing as mp
def worker(q, i): 
    q.put(i)

if __name__ == "__main__":
    q = mp.Queue()

    # Start sub-processes
    p = mp.Pool()
    for i in range(4):
        p.apply_async(worker, args=(q, i)) 

    # wait till all workers complete their task.
    p.close()
    p.join()

    # Get results from queue
    for i in range(4):
        print(q.get())

程序B是我在(https://docs.python.org/3/howto/logging-cookbook.html)项下简化程序的基础,以及满足您自己特定要求的代码的基础",它并没有使用经理。

计划B:

import multiprocessing as mp
def worker(q, i):
    q.put(i)

if __name__  == "__main__":
    q = mp.Queue()

    # Start sub-processes
    ws = []
    for i in range(4):
        w = mp.Process(target=worker, args=(q, i))
        ws.append(w)
        w.start()

    # wait till all workers complete their task.
    for w in ws:
        w.join()

    # Get results from queue
    for i in range(4):
        print(q.get())

0 个答案:

没有答案