Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,子线程上的函数超时,不使用signal和thread.join_Python_Python Multithreading - Fatal编程技术网

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

Python,子线程上的函数超时,不使用signal和thread.join,python,python-multithreading,Python,Python Multithreading,我想在子线程中调用的一个函数上添加一个超时。 我不能使用信号,因为信号应该在主线程上。 我不能使用thread.jointime\u out,因为该函数有时可以在几秒钟内执行,在这种情况下,线程将始终等待超时 还有其他方法吗 资料来源: thread.join: 信号: 您可以使用一个鲜为人知的ctyps hack来引发针对特定线程的TimeoutError。我使用此方法制作了一个非阻塞超时脚本,并在GitHub上发布了它: 实现起来非常简单,但技术上很复杂 def raise_call

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

还有其他方法吗

资料来源:

thread.join: 信号:
您可以使用一个鲜为人知的ctyps hack来引发针对特定线程的TimeoutError。我使用此方法制作了一个非阻塞超时脚本,并在GitHub上发布了它:

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

    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")

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

我认为线程有一个计时器类。。你能用它吗?timer类是在某个时间后启动一个线程。在这里,我想在某个时间后停止线程的执行。通常我轮询-使用当前时间并执行一段时间。看看第10行中的函数。