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阶...
啊,我现在知道了问题所在。
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背后的过程并不完全熟悉,但是它涉及在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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3444 次 |
| 最近记录: |