大致思路:
python 运行过程中会产生调用栈,当线程死锁时,栈信息就会停留在线程死锁的那一刻,通过查看此时的栈信息,就可以找到导致线程死锁的具体位置。
打印调用栈的核心代码如下:
def stacktraces(exclude=()):
code = []
current_frames = [(key, value) for key, value in sys._current_frames().items() if key not in exclude]
for threadId, stack in current_frames:
code.append("\n# ThreadID: %s" % threadId)
for filename, lineno, name, line in traceback.extract_stack(stack):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
stackinfo = highlight("\n".join(code), PythonLexer(), HtmlFormatter(
full=False,
# style="native",
noclasses=True,
))
return str(datetime.now()) + ('<p>\nthreadnums: %r</p>' % len(current_frames)) + stackinfo
这段代码可以打印出一段可读性较强的栈信息,只需要再再外层简单封装,令其每隔一段时间打印并记录下当前栈信息就可以有效定位出线程死锁的具体位置。