Python多线程中断休眠

15
在Python中,当线程处于睡眠状态时,有没有一种方法可以中断它?(就像Java中那样)我正在寻找类似的解决方案。
  import threading
  from time import sleep

  def f():
      print('started')
  try:
      sleep(100)
      print('finished')
  except SleepInterruptedException:
      print('interrupted')

t = threading.Thread(target=f)
t.start()

if input() == 'stop':
    t.interrupt()

该线程休眠100秒,如果我键入“stop”,它将被中断。


3
你可以使用 Event 实现,并且使用 Event.wait(100) - DocZerø
循环遍历100次,每次延迟1秒,并检查是否有任何异常。 - Asish M.
3个回答

32

正确的方法是使用 threading.Event。例如:

import threading

e = threading.Event()
e.wait(timeout=100)   # instead of time.sleep(100)

在另一个线程中,您需要访问e。您可以通过发出以下命令来打断睡眠:

e.set()

这将立即中断睡眠。您可以检查e.wait的返回值来确定它是否超时或被中断。有关更多信息,请参阅文档:https://docs.python.org/3/library/threading.html#event-objects


6

根据 https://dev59.com/dms05IYBdhLWcg3wIehj#7424818 的说法,如果我们只是想中断睡眠,那么事件可能是更好的解决方案,但如果我们中断睡眠以独占某些资源,则条件更好。 - Chris2048

1
如果由于某种原因需要使用time.sleep函数,并且期望time.sleep函数抛出异常,而您只是想测试大的睡眠值时会发生什么情况,而不必等待整个超时时间...首先,睡眠线程很轻量级,没有问题,只需让它们在守护进程模式下运行threading.Thread(target=f, daemon=True)(这样它们在程序退出时就会退出)。您可以使用t.join(0.5)在不等待整个执行的情况下检查线程的结果。但是,如果您绝对需要停止函数的执行,则可以使用multiprocessing.Process,并在生成的进程上调用.terminate()。这不会给进程清理的时间(例如,exceptfinally块不会运行),因此请谨慎使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接