操作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,使其解锁,但我仍想知道是否有操纵文件描述符就绪状态的编程方式。

编辑:我的问题是:我可以以某种方式手动设置文件描述符为“准备好”吗?

谢谢大家。

+0

“文件描述符为”手动“准备好”?你的意思是将数据写入文件以便读取数据?是。将数据写入文件以便读取数据。做到这一点的最简单方法是让FD(不出意外)成为一个插座。你在问什么?如何为管理/控制目的打开第二个套接字? – 2010-10-18 21:46:52

+0

是的,你的代码可以工作。你试过了吗?你发现了什么问题? – nosklo 2010-10-18 16:28:22

+0

哦,我想,我的问题是如何设置这个“fd”手动准备好..如果我只是打开一个文件它总是可读/写。 – 2010-10-18 17:52:52

最简单的做法可能是使用os.mkfifo()创建一个文件对,将读取的结尾添加到select()调用中,然后在想要解除阻止时写入写入结束。

此外,您可能需要考虑只为select()调用添加超时;我无法想象,在畅通无阻的时间里,你会做得足够好,拖慢性能。

+0

谢谢,这是我一直在寻找的东西。今天学到了新东西! – 2010-10-25 02:04:25

我认为你必须创建一个插口对(见socket.socketpair()功能),并生成一个单独的Python的线程(使用threading.Thread类)来监视,告诉你的程序何时结束的特殊情况。当线程检测到条件时,它可以写入“完成!” (或其他)连接到它的套接字对的末尾。如果套接字对中的另一端在等待读取的套接字列表中,则它会亮起,并说“一旦完成!”就可读。出现并准备从插座读取。

使用未命名的管道os.pipe()在这里也可以很好地工作(在读取结束时写入,写入写入结束)并且不需要指定路径。

我发现这种设置对多线程有用,当我希望一个线程能够中断另一个线程的阻塞选择调用。