在Python中使用管道文件描述符时如何检查EOF?

4
我有2个线程,线程A和线程B。
线程A从sys.stdin或使用os.pipe()从管道的读端获取数据。无论从sys.stdin还是从管道的读端读取了什么数据,它都会被发送到TCP套接字上。线程A使用select.select()来确定它应该从sys.stdin还是从管道的读端读取,并且select.select()使用1秒超时定期检查并确保套接字连接仍然存在。
线程B持有管道的写端,通常只会向管道写入1个非常长的字符串,然后关闭写端。
如何让线程A检查管道上的EOF?基本上,我希望线程A在不再使用时关闭管道。但是,我不能冒险在从管道读取()时阻塞,因为这样会不必要地阻塞sys.stdin上可用的数据。
非常感谢您的帮助。谢谢!
1个回答

7
检查管道是否结束的唯一方法是从中读取数据。事实上,当您关闭管道的写端时,即使没有实际可读取的数据,select.select()也会提示该套接字可以读取。当您从读取端读取数据时,空字符串('')表示已到达文件结尾(EOF)。即使管道处于阻塞模式,这也不会阻塞读取操作。
话虽如此,最好别使用阻塞读取。您可以使用fcntl.fcntl()将管道设置为非阻塞。您还可以直接从线程B发送数据到套接字,不用通过似乎无用的网关线程。如果您需要管理多个套接字,甚至是多个生产者线程,可以使用Twisted来管理套接字和其他通信。

谢谢,这非常有用。B线程做了更多的事情,不能被删除;我只是试图简化我的程序,以便提供足够的信息让别人回答我的问题。再次感谢! - pcd6623

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接