我的局域网上有一台仪器每5-10ms发送一个UDP数据包。在我的应用程序中,我有一个读取线程,在开始时分配一个带有大缓冲区的套接字,然后进入无限循环以读取累计的数据包,解析它们,将它们写入一个Spooler(暂存区),然后休眠半秒钟(time.sleep(0.500)
)。
我有几个懒惰的数据消费者,其中大多数进行归档或生成被动统计信息。但是,一个消费者(用于显示)需要实时数据,并且需要唤醒睡眠的读取器(以读取套接字),然后查询Spooler。
唤醒正在睡眠的线程的最佳方法是什么?
(或者,另外,有没有更好的线程睡眠方式,更容易唤醒?)
select
等待文件描述符活动。https://docs.python.org/3/library/select.html - Marcel Waldvogelselect
在所有操作系统上都不可用。 - martineauselect
在所有Unix/POSIX-ish操作系统上都是可用的,对于套接字而言,在Windows上也是可以使用的。因此,在网络环境中,它可以在“所有”操作系统上使用。如果仅涉及超时/通知,就像答案所建议的那样,那么就不需要select
。(如果你需要同时使用select
和信号,则可以使用pselect()
(https://netfuture.ch/2016/02/pselect-pitfalls/)或者[`signalfd()`](https://man7.org/linux/man-pages/man2/signalfd.2.html),当然,分别只能在POSIX或Linux上使用。) - Marcel Waldvogel