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

时间:2010-07-21 15:55:48

标签: python linux

我有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 个答案:

答案 0 :(得分:7)

在管道上检查EOF的唯一方法是从中读取。实际上,当您关闭管道的写入端时,即使没有要读取的实际数据,select.select()也会说套接字已准备好进行读取。当您从读取端读取时,空字符串('')将指示EOF。即使管道处于阻塞模式,也不会阻止您的读取。

尽管如此,完全不使用阻塞读取可能是个好主意。您可以使用fcntl.fcntl()设置非阻塞管道。你可以通过从线程B直接发送到套接字来避免使用两个线程,从而放弃看似无用的网关线程。如果您需要管理多个套接字,甚至需要管理多个生产者线程,Twisted是管理套接字和其他通信的好方法。