Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python多处理管道/队列未终止_Python_Queue_Multiprocessing_Pipe - Fatal编程技术网

python多处理管道/队列未终止

python多处理管道/队列未终止,python,queue,multiprocessing,pipe,Python,Queue,Multiprocessing,Pipe,我有两个关于python中管道/队列的问题 1) 管道未端接(即,从未抛出EOFError)。我知道这个问题的解决方法是将p传递给process()函数,并在该函数中关闭它。但我不知道为什么这是必要的 import multiprocessing def process(out_p): # in_p.close() while True: try: value = out_p.recv() print value

我有两个关于python中管道/队列的问题

1) 管道未端接(即,从未抛出EOFError)。我知道这个问题的解决方法是将p传递给process()函数,并在该函数中关闭它。但我不知道为什么这是必要的

import multiprocessing

def process(out_p):
    # in_p.close()
    while True:
        try:
            value = out_p.recv()
            print value
        except EOFError:
            print 'EOFError in pipe!'
            break
if __name__ == '__main__':
    out_p, in_p = multiprocessing.Pipe(duplex=False)
    proc = multiprocessing.Process(target=process, args=(out_p,))
    proc.start()
    out_p.close()
    for i in range(10):
        in_p.send(i)

    in_p.close()
2) 第二种情况更为复杂。在第一个问题的管道顶部。从管道接收到的值将进一步放入SimpleQueue中。在这种情况下,即使我将In_p和out_p传递给process()函数,它仍然不会终止

import multiprocessing
import multiprocessing.queues

def process(out_p, in_p, queue):
    in_p.close()
    while True:
        try:
            value = out_p.recv()
            print value
            queue.put(value**2)
        except EOFError:
            print 'EOFError in pipe!'
            queue.put('stop')
            break
def consumer(queue):
    while True:
        value = queue.get()
        print value
        if value == 'stop':
            break
if __name__ == '__main__':
    out_p, in_p = multiprocessing.Pipe(duplex=False)
    queue = multiprocessing.queues.SimpleQueue()
    proc = multiprocessing.Process(target=process, args=(out_p, in_p, queue))
    proc.start()

    cons = multiprocessing.Process(target=consumer, args=(queue,))
    cons.start()

    out_p.close()
    for i in range(10):
        in_p.send(i)
    in_p.close()
    proc.join()

我将非常感谢任何帮助

仅供参考,您的第一个示例在Python 3.3.2下运行良好。你的第二个例子也是。嗯,我使用的是python 2.7.5。这似乎是python中的bug。嗯!在2.7.5下,你的两个例子对我也很有效。但我目前正在Windows上运行。如果您在Linux-y系统上运行,则可能会丢失基于
fork()
的实现。