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

时间:2012-08-21 07:24:52

标签: python sockets

我无法唤醒被poll.poll()函数阻止的线程。有人能帮助我吗?

3 个答案:

答案 0 :(得分:5)

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

最初获取此额外文件描述符的常用方法是使用pipe()打开一个未命名的管道。这样你有两个描述符:你在poll()上打开读取等待的那个和你写入的另一个描述唤醒等待poll()的线程。

答案 1 :(得分:4)

有许多合理的理由想要在超时之前唤醒阻止轮询(2)或选择(2)。无论何时需要在被轮询的fd列表中添加或删除套接字,都需要摆脱等待。如果您依赖于超时,则超时必须很短才能响应,但是超时会导致很多不必要的抖动。

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

答案 2 :(得分:-1)

在轮询调用中使用超时,因此它不会无限期阻止。 N.B。:超时值以毫秒为单位。