Python ,子线程上的函数超时而不使用 signal 和 thread.join



我想在子线程内调用的一个函数上添加超时。我不能使用信号,因为信号应该在主线程上。我不能使用 thread.join(time_out) ,因为该功能有时可以在几秒钟内执行,在这种情况下,线程将始终等待time_out

还有其他方法吗?

来源:

  • thread.join:在python中使用线程的超时函数不起作用
  • signal:如果完成时间过长,则超时功能
您可以使用

鲜为人知的ctyps技巧来引发针对特定线程的TimeoutError。我使用此方法制作了一个non_blocking超时脚本,并刚刚在GitHub上发布了它:https://github.com/levimluke/PyTimeoutAfter

实现起来非常简单,但在技术上很复杂。

    def raise_caller(self):
        ret = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(self._caller_thread._ident), ctypes.py_object(self._exception))
        if ret == 0:
            raise ValueError("Invalid thread ID")
        elif ret > 1:
            ctypes.pythonapi.PyThreadState_SetAsyncExc(self._caller_thread._ident, NULL)
            raise SystemError("PyThreadState_SetAsyncExc failed")

https://github.com/levimluke/PyTimeoutAfter/blob/main/timeout_after.py#L47

使用类对象并将调用线程保存到,这样我就可以从定时子线程中在父类中引发异常。

相关内容

  • 没有找到相关文章

最新更新