为什么编程死锁但程序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())