3

我正在测试模块多处理中的队列结构的功能。我不明白为什么这段简单的代码无法针对几乎没有大的数据集终止

代码:

from multiprocessing import Process,Queue

if __name__ == "__main__":

    tobeQueue = Queue()

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

该代码应该终止,适用于小于等于 3 的 10 阶的范围......但不适用于高于 3 的 10 阶......

4

1 回答 1

10

啊,我现在知道问题所在了。

from Queue import Queue

from multiprocessing import Queue 

不是同一个队列。多处理 (mp)queue中有一些特殊代码,允许它在进程之间来回传递值。这是 python GIL 和线程障碍的结果。

正在发生的事情是,队列不允许它所在的进程死亡,直到它为空。特别注意第二个红色突出显示的警告。循环正常完成,队列不允许您的 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.
于 2013-10-08T20:25:06.380 回答