Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可中断睡眠?_Python_Multithreading_Events_Timer_Busy Waiting - Fatal编程技术网

Python 可中断睡眠?

Python 可中断睡眠?,python,multithreading,events,timer,busy-waiting,Python,Multithreading,Events,Timer,Busy Waiting,我目前正在构建一个python应用程序,它应该在用户输入的给定时间戳(不是按时间顺序输入)触发函数。 我遇到了一个问题,因为我不希望我的程序忙于等待检查是否输入了一个必须添加到计时器队列的新时间戳,但也不希望每次创建一个新时间戳时都创建一整组线程,因为它的单一用途是等待该时间戳。 我想到的是将所有这些放在一个线程中,然后做一些类似于可中断睡眠的事情,但除了这个,我想不出其他方法: while timer_not_depleted: sleep(1) if somethin

我目前正在构建一个python应用程序,它应该在用户输入的给定时间戳(不是按时间顺序输入)触发函数。
我遇到了一个问题,因为我不希望我的程序忙于等待检查是否输入了一个必须添加到计时器队列的新时间戳,但也不希望每次创建一个新时间戳时都创建一整组线程,因为它的单一用途是等待该时间戳。
我想到的是将所有这些放在一个线程中,然后做一些类似于可中断睡眠的事情,但除了这个,我想不出其他方法:

while timer_not_depleted:
      sleep(1)
      if something_happened:
          break
基本上就是忙着等待。 那么,有什么关于实现可中断睡眠的建议吗?

我想建议

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


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

您使用线程的直觉是正确的。以下施工主工可以工作:

  • 主线程产生一个等待“作业”的工作线程
  • 两个线程共享一个-每当需要调度一个新作业时,主线程都会将一个作业规范放入队列中
  • 同时,工作线程执行以下操作:
    • 维护未来要运行的作业的单独列表,并跟踪在下一个作业运行之前保持睡眠的时间
    • 通过打电话继续收听新工作
    • 在这种情况下,如果在超时之前没有计划新作业,
      Queue.get
      将引发
      Empty
      异常-此时工作线程应运行计划函数并返回轮询。如果同时计划了一个新作业,
      Queue.get
      返回新作业,这样您就可以更新
      timeout
      值,然后返回等待状态

经过一些编码后,这看起来很有希望,所以谢谢:)