多处理错误的管道错误.Queue

时间:2016-04-01 14:56:15

标签: python python-2.7 parallel-processing multiprocessing

在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对象,这当然很奇怪。

3 个答案:

答案 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中根本没有发生破裂的管道问题。我认为这是一个错误,后来得到修复。