我有一些python线程最终被永久阻止,而我认为罪魁祸首在我使用的某些库中。
我想知道是什么导致线程阻塞。由于我不知道此类库的代码,因此开始的一个好地方是知道导致这些线程阻塞的语句。
例如,我想知道“告诉我现在哪些线程被阻止,它们在哪个语句中”,或者对于我知道被阻止的给定pid线程“告诉我哪个语句阻止了它”。
有没有办法知道这一点?
请参见使用faulthandler.dump_traceback
和faulthandler.dump_traceback
(默认值)的简短示例程序
它创建6个线程。 3将运行很长时间,在all_threads=True
功能中被“阻塞”。其他三个将运行f1
,稍后会结束并退出。
f2
运行该程序时,您会注意到它被卡住了(由于打开了线程),但是在给出这样的输出之前却没有:
import faulthandler
import threading
import time
def f1():
time.sleep(99999)
def f2():
i = 1
for j in range(10000):
i += 1
for i in range(3):
threading.Thread(target=f1).start()
for i in range(3):
threading.Thread(target=f2).start()
time.sleep(1)
faulthandler.dump_traceback()
如我们所见,主线程位于第24行(触发此消息的Thread 0x000040f8 (most recent call first):
File "stack.py", line 7 in f1
File "C:\Program Files\Python37\lib\threading.py", line 865 in run
File "C:\Program Files\Python37\lib\threading.py", line 917 in _bootstrap_inner
File "C:\Program Files\Python37\lib\threading.py", line 885 in _bootstrap
Thread 0x000034d8 (most recent call first):
File "stack.py", line 7 in f1
File "C:\Program Files\Python37\lib\threading.py", line 865 in run
File "C:\Program Files\Python37\lib\threading.py", line 917 in _bootstrap_inner
File "C:\Program Files\Python37\lib\threading.py", line 885 in _bootstrap
Thread 0x00003a60 (most recent call first):
File "stack.py", line 7 in f1
File "C:\Program Files\Python37\lib\threading.py", line 865 in run
File "C:\Program Files\Python37\lib\threading.py", line 917 in _bootstrap_inner
File "C:\Program Files\Python37\lib\threading.py", line 885 in _bootstrap
Current thread 0x00004bb8 (most recent call first):
File "stack.py", line 24 in <module>
调用的位置),而其他3个线程当前位于faulthandler.dump_traceback
的第7行,f1
为精确。
我们不一定知道它们被“阻止”,除了我们在检查之前等待了合理的时间(在这种情况下为1秒)之外。如有必要,您也许可以循环检查一次,以监视一段时间后哪些线程保留在同一函数中。