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

4 投票
1 回答
5770 浏览
提问于 2025-04-16 01:38

我有两个线程,线程A和线程B。

线程A从标准输入(sys.stdin)或者一个管道的读端(通过os.pipe()创建)获取数据。无论是从标准输入还是管道读端读取到的数据,都会通过一个TCP套接字发送出去。线程A使用select.select()来判断是从标准输入还是管道读端读取数据,并且select.select()设置了1秒的超时,用来定期检查确保套接字连接仍然有效。

线程B持有管道的写端,通常只会向管道写入一条很长的字符串,然后关闭写端。

线程A怎么才能检查管道是否已经结束(EOF)呢?基本上,我希望线程A在不再使用管道时关闭它。但是,我不能在管道的read()上阻塞,因为那样会导致标准输入上的数据被不必要地阻塞。

任何帮助都会非常感谢。谢谢!

1 个回答

7

检查管道是否到达结束(EOF)的唯一方法就是从中读取数据。实际上,当你关闭管道的写入端时,select.select()会显示这个套接字可以读取,即使实际上没有数据可读。当你从读取端读取时,返回一个空字符串('')就表示已经到达结束。这种读取方式不会因为管道处于阻塞模式而被卡住。

不过,最好还是不要使用阻塞读取。你可以通过fcntl.fcntl()将管道设置为非阻塞模式。而且,你可以直接从线程B发送数据到套接字,这样就不需要看起来没什么用的中间线程。如果你需要管理多个套接字,或者有多个生产者线程,Twisted是一个很好的管理套接字和其他通信的工具。

撰写回答