我有两个与 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()
我将非常感谢任何帮助!