import multiprocessing as mp
import time
"""
1. send item via pipe
2. Receive on the other end by a generator
3. if the pipe is closed on the sending side, retrieve
all item left and then quit.
"""
def foo(conn):
for i in range(7):
time.sleep(.3)
conn.send(i)
conn.close()
def bar(conn):
while True:
try:
yield conn.recv()
except EOFError:
break
if __name__ == '__main__':
"""Choose which start method is used"""
recv_conn, send_conn = mp.Pipe(False)
p = mp.Process(target = foo, args = (send_conn,)) # f can only send msg.
p.start()
# send_conn.close()
for i in bar(recv_conn):
print(i)
我在Ubuntu 14.04上使用Python 3.4.1并且代码无效。在程序结束时,没有EOFError,它应该终止代码,尽管Pipe已经关闭。在函数内关闭管道不会关闭管道。为什么会这样?
答案 0 :(得分:2)
取消注释 send_conn.close()行。您应该在不需要它们的过程中关闭管道末端。问题是,一旦启动子进程,内核就会跟踪对管道发送连接的两个开放引用:一个在父进程中,一个在子进程中。
发送连接对象仅在子进程中关闭,在父进程中保持打开状态,因此 conn.recv()调用不会引发EOFError。管道仍然打开。
This answer也可能对您有用。
如果您取消注释 send_conn.close()调用,我确认此代码适用于Python 2.7.6。