在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()
的地方,我希望将其返回到当前正在执行的函数中。这样,我就可以利用这些信息来弄清楚它是如何陷入某种无限循环的。
答案 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
)