在python2.7中,multiprocessing.Queue在从函数内部初始化时抛出一个破坏的错误。我提供了一个重现问题的最小例子。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import multiprocessing
def main():
q = multiprocessing.Queue()
for i in range(10):
q.put(i)
if __name__ == "__main__":
main()
抛出以下损坏的管道错误
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 268, in _feed
send(obj)
IOError: [Errno 32] Broken pipe
Process finished with exit code 0
我无法破译原因。我们无法从函数内部填充Queue对象,这当然很奇怪。
答案 0 :(得分:7)
当您启动Queue.put()时,将启动隐式线程以将数据传递到队列。同时,主应用程序已完成,数据没有结束站(队列对象被垃圾收集)。
我会试试这个:
from multiprocessing import Queue
def main():
q = Queue()
for i in range(10):
print i
q.put(i)
q.close()
q.join_thread()
if __name__ == "__main__":
main()
join_thread()
确保缓冲区中的所有数据都已刷新。必须在close()
join_thread()
答案 1 :(得分:5)
这里发生的是当你调用main()
时,它创建Queue
,在其中放置10个对象并结束函数,垃圾收集其所有内部变量和对象,包括{{ 1}}。
但是您收到此错误是因为您仍在尝试发送Queue
中的最后一个数字。
来自文档documentation:
"当一个进程首先将一个项目放入队列时,一个进给者线程就是 已启动,它将对象从缓冲区传输到管道中。"
由于Queue
是在另一个线程中创建的,因此它不会阻止脚本的执行,并允许在完成队列操作之前结束put()
函数。
试试这个:
main()
应该有#!/usr/bin/python
# -*- coding: utf-8 -*-
import multiprocessing
import time
def main():
q = multiprocessing.Queue()
for i in range(10):
print i
q.put(i)
time.sleep(0.1) # Just enough to let the Queue finish
if __name__ == "__main__":
main()
队列或块执行的方法,直到将对象放入join
,你应该看一下文档。
答案 2 :(得分:0)
如@HarryPotFleur建议使用time.sleep(0.1)
延迟,此问题已解决。但是,我用python3测试了代码,并且在python3中根本没有发生破裂的管道问题。我认为这是一个错误,后来得到修复。