知道线程在哪里被封锁[关闭]

问题描述 投票:-1回答:1

我有一些python线程最终被永久阻止,而我认为罪魁祸首在我使用的某些库中。

我想知道是什么导致线程阻塞。由于我不知道此类库的代码,因此开始的一个好地方是知道导致这些线程阻塞的语句。

例如,我想知道“告诉我现在哪些线程被阻止,它们在哪个语句中”,或者对于我知道被阻止的给定pid线程“告诉我哪个语句阻止了它”。

有没有办法知道这一点?

python multithreading python-multiprocessing python-multithreading
1个回答
0
投票

请参见使用faulthandler.dump_tracebackfaulthandler.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秒)之外。如有必要,您也许可以循环检查一次,以监视一段时间后哪些线程保留在同一函数中。

© www.soinside.com 2019 - 2024. All rights reserved.