检查python当前正在做什么线程

时间:2017-07-24 21:17:47

标签: python multithreading

在python中,是否可以向线程询问它目前在做什么?有些代码可能如下所示:

import threading
import time
import random


def foo():
    a = 'spam'


def bar():
    if random.random() < 0.01:      # go into an infinite loop 1% of the time
        while True:
            x = 42

def run(heartbeat):
    while True:
        foo()
        bar()
        heartbeat.set()

heartbeat = threading.Event()
t = threading.Thread(target=run, args=(heartbeat, ))
t.start()

while True:
    time.sleep(1)
    if heartbeat.is_set():
        heartbeat.clear()
    else:
        print('Thread appears stuck at the following location: ')
        print(get_thread_position(t))

我希望这样做来监控线程,看看它们是否挂起。心跳事件检查它们是否处于活动状态并正常进行。但是,如果他们挂在某个地方,我希望能够找到原因。这就是我发明get_thread_position()的地方,我希望将其返回到当前正在执行的函数中。这样,我就可以利用这些信息来弄清楚它是如何陷入某种无限循环的。

1 个答案:

答案 0 :(得分:3)

您可以使用sys._current_frames()为每个当前运行的线程选取顶部框架列表,然后在其中找到您的线程,然后检查其框架,例如:

import sys

def get_thread_position(thread):
    frame = sys._current_frames().get(thread.ident, None)
    if frame:
        return frame.f_code.co_filename, frame.f_code.co_name, frame.f_code.co_firstlineno

这将返回一个元组,其中包含当前在该线程中执行的函数的文件名,函数名和行号。当然,您也可以获取其他帧信息。如果找不到线程(即在此期间死亡),它将不会返回任何内容(None