Python:Multiprocessing Queue.put不适用于半大数据

Ark*_*rko 3 python queue put multiprocessing

我正在测试模块多处理中Queue结构的功能。我看不到为什么这段简单的代码无法为几乎不大的数据集终止

码:

from multiprocessing import Process,Queue

if __name__ == "__main__":

    tobeQueue = Queue()

    for i in range(1,10000):
        tobeQueue.put(i)
Run Code Online (Sandbox Code Playgroud)

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

gre*_*212 6

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

from Queue import Queue
Run Code Online (Sandbox Code Playgroud)

from multiprocessing import Queue 
Run Code Online (Sandbox Code Playgroud)

不在同一队列中。多重处理(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.
Run Code Online (Sandbox Code Playgroud)