在Python中关闭管道

时间:2014-07-17 09:35:33

标签: python-3.x

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已经关闭。在函数内关闭管道不会关闭管道。为什么会这样?

1 个答案:

答案 0 :(得分:2)

取消注释 send_conn.close()行。您应该在不需要它们的过程中关闭管道末端。问题是,一旦启动子进程,内核就会跟踪对管道发送连接的两个开放引用:一个在父进程中,一个在子进程中。

发送连接对象仅在子进程中关闭,在父进程中保持打开状态,因此 conn.recv()调用不会引发EOFError。管道仍然打开。

This answer也可能对您有用。

如果您取消注释 send_conn.close()调用,我确认此代码适用于Python 2.7.6。