操作Python中select.select的文件描述符
我有一个痒的问题我知道可以用许多不同的方法解决,但我仍然想知道下面的方法在Python中是否可行。操作Python中select.select的文件描述符
假设我有一些套接字,我一直在等待输入,并且有一些条件最终终止了整个程序。我想这样做,以阻塞方式,如我想象,用select.select:
readfds, writefds, errfds = select.select([mysocket],[],[])
if readfds:
conn, addr = mysocket.accept()
...
现在,如果有一些文件描述符fd,我可以手动设置到准备状态,读取或写入,我可以做
readfds, writefds, errfds = select.select([mysocket,fd],[],[])
for r in readfds:
if r == mysocket:
conn, addr = mysocket.accept()
...
else:
<terminate>
当然,我可以简单地将消息发送给mysocket,使其解锁,但我仍想知道是否有操纵文件描述符就绪状态的编程方式。
编辑:我的问题是:我可以以某种方式手动设置文件描述符为“准备好”吗?
谢谢大家。
最简单的做法可能是使用os.mkfifo()
创建一个文件对,将读取的结尾添加到select()
调用中,然后在想要解除阻止时写入写入结束。
此外,您可能需要考虑只为select()
调用添加超时;我无法想象,在畅通无阻的时间里,你会做得足够好,拖慢性能。
谢谢,这是我一直在寻找的东西。今天学到了新东西! – 2010-10-25 02:04:25
我认为你必须创建一个插口对(见socket.socketpair()
功能),并生成一个单独的Python的线程(使用threading.Thread
类)来监视,告诉你的程序何时结束的特殊情况。当线程检测到条件时,它可以写入“完成!” (或其他)连接到它的套接字对的末尾。如果套接字对中的另一端在等待读取的套接字列表中,则它会亮起,并说“一旦完成!”就可读。出现并准备从插座读取。
“文件描述符为”手动“准备好”?你的意思是将数据写入文件以便读取数据?是。将数据写入文件以便读取数据。做到这一点的最简单方法是让FD(不出意外)成为一个插座。你在问什么?如何为管理/控制目的打开第二个套接字? – 2010-10-18 21:46:52
是的,你的代码可以工作。你试过了吗?你发现了什么问题? – nosklo 2010-10-18 16:28:22
哦,我想,我的问题是如何设置这个“fd”手动准备好..如果我只是打开一个文件它总是可读/写。 – 2010-10-18 17:52:52