Python:多处理Queue.put不适用于半大数据

时间:2013-10-08 20:10:41

标签: python queue multiprocessing put

我正在模块多处理中测试Queue结构的功能。我不明白为什么这段简单的代码无法为一个难度大的数据集终止

代码:

from multiprocessing import Process,Queue

if __name__ == "__main__":

    tobeQueue = Queue()

    for i in range(1,10000):
        tobeQueue.put(i)

此代码应终止,适用于小于等于3的10个数量级的范围......但不适用于高于10的订单...

1 个答案:

答案 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背后的过程,但它涉及在putget进程之间挑选队列中的项目。因此,异常消除一个进程可能会导致死锁。

因此您需要使用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.