Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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/2/ssis/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 如何实时解决线程死锁?_Python_Python 3.x_Python Multithreading - Fatal编程技术网

Python 如何实时解决线程死锁?

Python 如何实时解决线程死锁?,python,python-3.x,python-multithreading,Python,Python 3.x,Python Multithreading,如果在运行时怀疑python线程之间存在死锁,是否有任何方法可以在不中断整个进程的情况下解决它 例如,如果有几个线程花费的时间远远超过它们应该花费的时间,资源管理器可能会怀疑其中一些线程处于死锁状态。当然,将来应该在代码中对其进行调试和修复,但是否有一个干净的解决方案可以立即(在运行时)使用,以杀死特定的线程,以便其他线程可以恢复 编辑:我正在考虑添加一些“死锁检测”循环(在它自己的线程中),该循环会休眠一段时间,然后检查所有正在运行的线程,如果其中一些线程看起来慢得令人怀疑,它会杀死其中最不重

如果在运行时怀疑python线程之间存在死锁,是否有任何方法可以在不中断整个进程的情况下解决它

例如,如果有几个线程花费的时间远远超过它们应该花费的时间,资源管理器可能会怀疑其中一些线程处于死锁状态。当然,将来应该在代码中对其进行调试和修复,但是否有一个干净的解决方案可以立即(在运行时)使用,以杀死特定的线程,以便其他线程可以恢复

编辑:我正在考虑添加一些“死锁检测”循环(在它自己的线程中),该循环会休眠一段时间,然后检查所有正在运行的线程,如果其中一些线程看起来慢得令人怀疑,它会杀死其中最不重要的一个。线程在什么时候被怀疑死锁,以及其中最不重要的一点,当然是由死锁检测循环程序员定义的

显然,它不会捕获所有问题(最明显的是,如果死锁检测线程本身处于死锁状态)。我们的想法不是要找到一个数学上完美的解决方案(当然,也就是说,不要编写可能会死锁的代码)。相反,我想在一些实际情况下部分解决这个问题。

您可以提前尝试使用代码片段,但在执行过程中,程序被卡住了,您对此无能为力


WinDbg或strace等调试器可能会有所帮助,但由于Python是一种解释性语言,我怀疑它们是否能实际使用。

编写不会死锁的代码。@Fredrik当然,我完全同意。但在一个由多人编写的大型代码库中很难快速实现这一点,有时可能会出现死锁。随着时间的推移,将阅读/修复/重新设计代码与一些可以改善应用程序行为的即时自动死锁解决方案结合起来可能是值得的。如果说主线程死锁,你的策略是什么?@Natecat我试图在编辑中回答你的问题。这太棒了,在检测方面比我想象的要好。但是有什么办法可以“解除死锁”线程,比如杀死它们吗?@max您可以使用未记录的和外部API调用杀死线程。它很有可能使内存“卡布姆”并损坏整个堆栈。看见你也可以在你的代码上写满
2/0
,然后
exec()
。根据该链接,它似乎不会损坏堆栈,只会在堆上留下一堆无法收集的垃圾。更大的问题是杀死一个线程不会自动释放它持有的锁(无论是GIL还是通过python
threading
API获取的单个资源的锁)。因此,在我的案例中,终止线程的整个意义都被击败了。