在Python中处理select.select的文件描述符

时间:2010-10-18 16:13:05

标签: python sockets select blocking file-descriptor

我有一个瘙痒的问题,我知道可以通过许多不同的方式解决,但我仍然想知道在Python中是否可以采用以下方法。

假设我有一些套接字我一直在等待输入,并且有一些条件最终会终止整个程序。正如我想象的那样,我想用BLOCKING方式,使用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发送一条消息,导致它解除封锁,但我仍然想知道是否有一种编程方式将文件描述符操作为就绪状态。

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

谢谢大家。

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用os.mkfifo()创建文件对,将读取端添加到select()调用,然后在要取消阻塞时写入写入端。 / p>

此外,您可能只想考虑在select()电话中添加超时;我无法想象你在未受阻挡的时间内做得不够好以降低性能。

答案 1 :(得分:0)

我认为您必须创建一个套接字对(请参阅socket.socketpair()函数)并生成一个单独的Python线程(使用threading.Thread类)来监视告诉您程序的特殊条件什么时候结束当线程检测到条件时,它可以写“完成!” (或其他)到套接字对的末尾。如果你正在等待读取的套接字列表中有套接字对的另一端,那么它会亮起并说“一完成”就可以读取它。出现并准备从插座中读出。

答案 2 :(得分:0)

使用未命名的管道os.pipe()在这里也可以正常工作(在读取端阻塞,写入写入端)并使您不必指定路径。

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