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

时间:2013-10-26 00:43:05

标签: python queue multiprocessing pipe

我在python中有两个与管道/队列相关的问题。

1)管道没有终止(即永远不会抛出EOFError)。我知道这个问题的解决方案是将in_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()

我将非常感谢您的帮助!

0 个答案:

没有答案