4

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

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

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

谢谢大家。

4

3 回答 3

2

最简单的做法大概就是用os.mkfifo()创建文件对,在select()调用中加入读端,想解除阻塞的时候再写到写端。

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

于 2010-10-20T21:43:34.780 回答
0

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

于 2010-10-20T21:27:37.337 回答
0

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

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

于 2013-05-04T15:42:17.303 回答