Python线程中断睡眠

时间:2016-08-08 11:55:11

标签: python multithreading thread-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秒,如果我键入'停止'它会中断

3 个答案:

答案 0 :(得分:6)

正确的方法是使用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

答案 1 :(得分:3)

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

而不是sleep(),您使用wait( timeout )。到"中断"你打电话给notify()。

答案 2 :(得分:0)

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

首先,睡眠线程是轻量级的,只用threading.Thread(target=f, daemon=True)让它们在守护程序模式下运行是没有问题的(以便它们在程序运行时退出)。您可以检查线程的结果,而不必等待t.join(0.5)的整个执行。

但是,如果您绝对需要停止执行该函数,则可以使用multiprocessing.Process,并在产生的进程上调用.terminate()。这并没有给清理时间(例如exceptfinally块未运行),因此请谨慎使用。