2010-07-21 60 views
2

我有2个线程,线程A和线程B.如何在Python中使用管道文件描述符时检查EOF?

线程A从sys.stdin或管道的读取结束(使用os.pipe())获取数据。无论读取什么数据(从sys.stdin或管道的读取端),都会通过TCP套接字发送出去。线程A使用select.select()来确定它是应该从sys.stdin还是从管道的读取端读取,并且select.select()使用1秒超时来定期检查并确保套接字连接是还在那儿。

线程B持有管道的写入结束,并且通常只会将1个真正长的字符串写入管道,然后关闭写入结束。

线程A如何检查管道上的EOF?基本上,我希望线程A在不再使用时关闭管道。但是,我不能冒险阻塞从管道读取(),因为然后sys.stdin上可用的数据将被不必要地阻止。

任何帮助将不胜感激。谢谢!

回答

7

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

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

+0

谢谢,这非常有用。线程B比我提到的要多,不能删除;我只是试图简化我的程序,以便我只提供足够的信息让某人回答我的问题。再次感谢! – pcd6623 2010-07-21 20:49:30

相关问题