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()
。这不会给进程清理时间(例如 except
和 finally
块不是 运行),因此请小心使用它。
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()
。这不会给进程清理时间(例如 except
和 finally
块不是 运行),因此请小心使用它。