在 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 等效项

在 Python 脚本中检查交互式 shell

使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取

检查詹金斯管道中是不是存在文件