0

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

while timer_not_depleted:
      sleep(1)
      if something_happened:
          break

这本质上是忙于等待。那么关于实现可中断睡眠的任何建议?

4

2 回答 2

0

我想建议select

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

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

于 2020-10-20T14:08:01.593 回答
0

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

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