我有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上可用的数据将被不必要地阻止。
非常感谢任何帮助。谢谢!
答案 0 :(得分:7)
在管道上检查EOF的唯一方法是从中读取。实际上,当您关闭管道的写入端时,即使没有要读取的实际数据,select.select()
也会说套接字已准备好进行读取。当您从读取端读取时,空字符串(''
)将指示EOF。即使管道处于阻塞模式,也不会阻止您的读取。
尽管如此,完全不使用阻塞读取可能是个好主意。您可以使用fcntl.fcntl()
设置非阻塞管道。你可以通过从线程B直接发送到套接字来避免使用两个线程,从而放弃看似无用的网关线程。如果您需要管理多个套接字,甚至需要管理多个生产者线程,Twisted是管理套接字和其他通信的好方法。