【问题标题】:Best way to wake a sleeping thread?唤醒睡眠线程的最佳方法?
【发布时间】: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。 (如果您需要select and signals, there is pselect()signalfd(),当然只能分别在 POSIX 或 Linux 上使用。)

标签: python multithreading events sleep


【解决方案1】:

我没有注意到 threading.condition.wait() 有一个可选的超时参数!

答案是create a condition object 并使用其wait() 方法和可选超时而不是time.sleep()。如果线程需要在超时前被唤醒,调用条件对象的notify()方法。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2011-07-29
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多