我试图创建一个超时,如果一个函数没有及时完成执行,将返回一个默认值。我下面的内容似乎可以正常工作,只是在主线程中引发了KeyboardInterrupt
异常,而我的回调函数在一个单独的线程中。
Python中是否可以指定引发异常的线程?
def interrupt():
raise KeyboardInterrupt
def callback_function():
# Start 16 ms timer
timer = threading.Timer(0.016, interrupt)
timer.start()
try:
result = inconsistent_execution_time_function(data)
timer.cancel()
except KeyboardInterrupt:
print("Long execution time")
result = default
return result
答案 0 :(得分:1)
您认为解决方案不起作用,因为threading.Timer()
是使用单独的线程(不是主线程)实现的,因此无法将异常传播到原始线程。您的方法行不通。
通常的解决方案是采用合作方式。创建上下文对象,可能使用线程本地存储。该上下文对象以表示是否发生超时的布尔值开始设置为false。您的interrupt()
函数将该var设置为true。然后,您的inconsistent_execution_time_function()
会定期检查var是否为真。
但是,如果您绝对希望发送信号(可能会中断长时间运行的系统调用),则应在计时器函数中使用signal.pthread_kill()
。显然,您需要通过在函数的定义中添加适当的参数并将callback_function()
的参数添加到args=(threading.ident)
调用中,来向该函数发送threading.Timer()
的线程ID。