如何在Python中向特定线程抛出异常?

时间:2019-05-22 18:11:01

标签: python python-3.x multithreading

我试图创建一个超时,如果一个函数没有及时完成执行,将返回一个默认值。我下面的内容似乎可以正常工作,只是在主线程中引发了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

1 个答案:

答案 0 :(得分:1)

您认为解决方案不起作用,因为threading.Timer()是使用单独的线程(不是主线程)实现的,因此无法将异常传播到原始线程。您的方法行不通。

通常的解决方案是采用合作方式。创建上下文对象,可能使用线程本地存储。该上下文对象以表示是否发生超时的布尔值开始设置为false。您的interrupt()函数将该var设置为true。然后,您的inconsistent_execution_time_function()会定期检查var是否为真。

但是,如果您绝对希望发送信号(可能会中断长时间运行的系统调用),则应在计时器函数中使用signal.pthread_kill()。显然,您需要通过在函数的定义中添加适当的参数并将callback_function()的参数添加到args=(threading.ident)调用中,来向该函数发送threading.Timer()的线程ID。