如何在python中的套接字编程中从另一个线程唤醒被select.poll.poll()函数阻塞的线程



我没有办法唤醒被poll.poll()函数阻塞的线程。有人能帮我吗?

处理此问题的方法是在传递给poll()的描述符列表中包含一个额外的文件描述符。对于该描述符,请等待读取准备就绪。让任何其他线程想要唤醒等待poll()的线程写入该额外的描述符。这时,调用poll()的线程恢复执行,看到额外的描述符就是唤醒它的描述符,并执行任何操作。

最初获取这个额外文件描述符的正常方法是使用pipe()打开一个未命名的管道。这样,您就有了两个描述符:一个是在poll()中进行读取等待,另一个是向其写入以唤醒在poll上等待的线程。

想要在阻塞轮询超时之前唤醒(2)或选择(2)有很多正当的理由。任何时候,当您需要在被轮询的fd列表中添加或删除套接字时,都需要打破等待。如果你依赖超时,超时必须很短才能做出响应,但短的超时可能会导致很多不必要的颠簸。

无论如何,对于Linux,您可以使用eventfd(2)创建一个文件描述符,将其添加到fd列表中。当您需要打破等待时,请写入eventfd。

在轮询调用中使用超时,这样它就不会无限期地阻塞。注意:超时值以毫秒为单位。

最新更新