我正在模块多处理中测试Queue结构的功能。我不明白为什么这段简单的代码无法为一个难度大的数据集终止
代码:
from multiprocessing import Process,Queue
if __name__ == "__main__":
tobeQueue = Queue()
for i in range(1,10000):
tobeQueue.put(i)
此代码应终止,适用于小于等于3的10个数量级的范围......但不适用于高于10的订单...
答案 0 :(得分:4)
我现在知道问题是什么。
from Queue import Queue
和
from multiprocessing import Queue
不是同一个队列。多处理(mp)queue
中有一些特殊代码,允许它在进程之间来回传递值。这是python GIL和线程障碍的结果。
What is happening, is the queue will not allow the process it is in to die until it is empty.要特别注意第二个红色突出显示的警告。循环正常完成,队列不允许你的python进程终止,因为队列不在共享内存中,就像你期望的线程一样。我并不完全熟悉mp.Queue背后的过程,但它涉及在put
和get
进程之间挑选队列中的项目。因此,异常消除一个进程可能会导致死锁。
因此您需要使用queue.get()
完全卸载队列,并且您的流程将按预期终止。
此代码将按预期终止:
from multiprocessing import Process,Queue
if __name__ == "__main__":
tobeQueue = Queue()
for i in range(1,10000):
tobeQueue.put(i)
for i in range(1,10000):
tobeQueue.get() #remove all 9999 items, allow it to die.