Python线程中断休眠

Python threading interrupt sleep

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',它会中断

如何使用条件对象:https://docs.python.org/2/library/threading.html#condition-objects

您使用 wait(timeout) 而不是 sleep()。要 "interrupt" 你调用 notify()。

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

import threading

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

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

e.set()

这会立即中断睡眠。可以查看e.wait的return值判断是否超时或中断。有关详细信息,请参阅文档:https://docs.python.org/3/library/threading.html#event-objects .

如果您出于某种原因需要使用 time.sleep 函数并且碰巧期望 time.sleep 函数抛出异常,而您只是想测试大睡眠值时发生的情况而不必须等待整个超时...

首先,休眠线程是轻量级的,只要让它们 运行 在 threading.Thread(target=f, daemon=True) 的守护进程模式下就没有问题(这样它们就会在程序退出时退出)。您可以使用 t.join(0.5).

检查线程的结果而无需等待整个执行

但是如果您绝对需要停止函数的执行,您可以使用 multiprocessing.Process,并在生成的进程上调用 .terminate()。这不会给进程清理时间(例如 exceptfinally 块不是 运行),因此请小心使用它。