【发布时间】:2014-05-15 23:43:18
【问题描述】:
我的 LAN 上有一个仪器每 5-10 毫秒发送一个 UDP 数据包。在我的应用程序中,我有一个读取器线程,它在启动时分配一个带有大缓冲区的套接字,然后进入一个无限循环来读取累积的数据包,解析它们,将它们写入假脱机程序,然后休眠半秒(@987654324 @)。
我有几个懒惰的数据消费者,其中大部分用于归档或生成被动统计信息。但是一个消费者(用于显示)需要最新的数据,并且需要在查询假脱机程序之前唤醒正在休眠的读取器(以读取套接字)。
唤醒睡眠线程的最佳方法是什么?
(或者,或者,有没有更好的方法让线程更容易唤醒?)
【问题讨论】:
-
你为什么需要睡觉?
-
因为这样做效率更高。
-
@BobC:等待实际事件发生而不是定期轮询事件是否已经发生通常更有效。例如。使用
select等待文件描述符活动。 docs.python.org/3/library/select.html -
@MarcelWaldvogel:
select并非在所有操作系统上都可用。 -
Python
select在所有 Unix/POSIX-ish 操作系统上公开,用于套接字也在 Windows 上公开。因此,在网络环境中,它适用于“所有”操作系统。如果只是超时/通知,如答案所示,则不需要select。 (如果您需要selectand signals, there ispselect()或signalfd(),当然只能分别在 POSIX 或 Linux 上使用。)
标签: python multithreading events sleep