唤醒一个睡眠的线程的最佳方法是什么?

19

我的局域网上有一台仪器每5-10ms发送一个UDP数据包。在我的应用程序中,我有一个读取线程,在开始时分配一个带有大缓冲区的套接字,然后进入无限循环以读取累计的数据包,解析它们,将它们写入一个Spooler(暂存区),然后休眠半秒钟(time.sleep(0.500))。

我有几个懒惰的数据消费者,其中大多数进行归档或生成被动统计信息。但是,一个消费者(用于显示)需要实时数据,并且需要唤醒睡眠的读取器(以读取套接字),然后查询Spooler。

唤醒正在睡眠的线程的最佳方法是什么?

(或者,另外,有没有更好的线程睡眠方式,更容易唤醒?)


为什么你需要睡觉呢? - Martin James
因为这样做更有效率。 - BobC
@BobC:通常更有效的方法是等待实际事件发生,而不是定期轮询事件是否已经发生。例如,使用select等待文件描述符活动。https://docs.python.org/3/library/select.html - Marcel Waldvogel
@MarcelWaldvogel:select 在所有操作系统上都不可用。 - martineau
Python的select在所有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
1个回答

28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接