在 Python 中使用管道文件描述符时如何检查 EOF?
Posted
技术标签:
【中文标题】在 Python 中使用管道文件描述符时如何检查 EOF?【英文标题】:How to check for EOF when using pipe file descriptors in Python? 【发布时间】:2010-07-21 15:55:47 【问题描述】:我有 2 个线程,线程 A 和线程 B。
线程 A 从 sys.stdin 或管道的读取端获取数据(使用 os.pipe())。无论读取什么数据(从 sys.stdin 或从管道的读取端)都会在 TCP 套接字上发送出去。线程 A 使用 select.select() 来确定它应该从 sys.stdin 还是从管道的读取端读取,并且 select.select() 使用 1 秒超时来定期检查并确保套接字连接是还在。
线程 B 持有管道的写入端,通常只会向管道写入 1 个非常长的字符串,然后关闭写入端。
线程 A 如何检查管道上的 EOF?基本上,我希望线程 A 在不再使用时关闭管道。但是,我不能冒险阻塞管道中的 read(),因为这样会不必要地阻塞 sys.stdin 上可用的数据。
任何帮助将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:在管道上检查 EOF 的唯一方法是读取它。事实上,当您关闭管道的写入端时,select.select()
会说套接字已准备好读取,即使没有要读取的实际数据也是如此。当您从读取端读取时,空字符串 (''
) 将指示 EOF。即使管道处于阻塞模式,这也不会阻塞您的读取。
也就是说,完全不使用阻塞读取可能是个好主意。您可以使用fcntl.fcntl()
将管道设置为非阻塞。您可以通过从线程 B 直接发送到套接字来避免使用两个线程,放弃看似无用的网关线程。如果您有多个需要管理的套接字,甚至是多个生产者线程,Twisted 是管理套接字和其他通信的好方法。
【讨论】:
谢谢,这非常有用。线程 B 做的比我提到的要多,不能被删除;我只是试图简化我的程序,以便我只提供足够的信息供某人回答我的问题。再次感谢!以上是关于在 Python 中使用管道文件描述符时如何检查 EOF?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查数据是不是已完成加载以使用异步管道 Angular 8
如何在 Python 中使用管道分隔符拆分文本文件,然后使列数等于属性值的数量?
使用管道在 Perl 中将管道文件输出到 gzip 的 Python 等效项