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秒,如果我键入'停止'它会中断
答案 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()
。这并没有给清理时间(例如except
和finally
块未运行),因此请谨慎使用。