【问题标题】:Interruptable Sleep?可中断睡眠?
【发布时间】:2020-10-20 13:03:46
【问题描述】:

我目前正在构建一个 python 应用程序,它应该在用户输入的给定时间戳(不按时间顺序输入)触发函数。
我遇到了一个问题,因为我不希望我的程序忙于等待检查是否输入了必须添加到计时器队列的新时间戳,但也不希望每次新时间戳都创建一大堆线程以等待该时间戳的单一目的进行创建。
我想到的是将所有内容放在一个线程中并执行可中断睡眠之类的操作,但除此之外我想不出其他方法:

while timer_not_depleted:
      sleep(1)
      if something_happened:
          break

本质上是忙于等待。 那么关于实现可中断睡眠有什么建议吗?

【问题讨论】:

    标签: python multithreading events timer busy-waiting


    【解决方案1】:

    我想建议select

    调用它的超时等于最近事件的延迟(heap queue 是一个很好的数据结构来维护未来时间戳的队列)并提供一个套接字(作为rlist arg 中的一个项目),其中您的程序会监听用户的更新。

    当套接字有传入数据或发生超时时,select 调用返回。

    【讨论】:

      【解决方案2】:

      您对使用线程的直觉是正确的。以下 master-worker 构造可以工作:

      • 主线程产生一个等待“作业”的工作线程;
      • 两个线程共享一个Queue - 每当需要调度新作业时,主线程puts 将作业规范放入队列;
      • 同时,工作线程执行以下操作:
        • 维护一个单独的未来作业列表,并跟踪在下一个作业运行之前要保持休眠多长时间;
        • 拨打Queue.get(block=True, timeout=<time-to-next-job>)继续收听新工作;
        • 在这种情况下,如果在超时之前没有安排新的作业,Queue.get 将引发Empty 异常 - 此时工作线程应该运行预定的函数并返回轮询。如果同时安排了新作业Queue.get 会返回新作业,以便您可以更新 timeout 值,然后返回等待。

      【讨论】:

      • 经过一些编码后,这看起来很有希望,所以谢谢你:)
      猜你喜欢
      • 2020-05-02
      • 2014-07-07
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2020-04-01
      • 2012-12-02
      • 2013-01-10
      • 2019-05-24
      相关资源
      最近更新 更多