前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python2运行时查看线程信息

Python2运行时查看线程信息

作者头像
kongxx
发布2018-05-14 14:14:24
8500
发布2018-05-14 14:14:24
举报

今天遇见一个 Python 问题,在测试环境中发现用 Python2.7.10 写的程序有时候会慢慢变慢,在使用 "pstack <pid>" 查看进程的时候发现起了很多的线程,并且越来越多,这肯定是程序有问题,但是使用 pstack 命令看不到具体每个线程是在做什么,于是我就想是不是可以在不影响进程运行的情况下随时查看每个线程都在干什么。

于是乎,我大致想了一下

  1. 可以使用 signal 模块在处理程序接收 kill 信号,这样我就可以使用 “kill -3 <pid>” 来给进程发信号,然后输出线程信息而不影响进程继续运行。这里具体信号可以根据情况换成别的信号。
  2. 可以使用 sys._current_frames() 和 threading.enumerate() 来获取进程的线程信息。

好,有想法了,开工干活,看下面一个具体例子

import os
import sys
import threading
import traceback
import signal
import tempfile
from datetime import datetime
import time


def test():
    while True:
        print datetime.now()
        time.sleep(2)


def signal_handler(signum, frame):
    try:
        print '---'
        result = []
        result.append("*** STACKTRACE - START ***\n")

        threads = threading.enumerate()
        for thread in threads:
            stack = sys._current_frames()[thread.ident]
            result.append("\nThread ID: %s, Name: %s\n" % (thread.ident, thread.name))
            for filename, line_no, name, line in traceback.extract_stack(stack):
                result.append('  "%s", line %d, in %s\n' % (filename, line_no, name))
                if line:
                    result.append("    %s\n" % (line.strip()))

        result.append("\n*** STACKTRACE - END ***\n")

        file = os.path.join(tempfile.gettempdir(), datetime.now().strftime('%Y%m%d%H%M%S') + ".log")
        with open(file, 'w+') as f:
            f.writelines(result)
    except BaseException as e:
        print e


if __name__ == "__main__":
    try:
        signal.signal(signal.SIGQUIT, signal_handler)

        threading.Thread(target=test).start()

        while True:
            time.sleep(60)
    except KeyboardInterrupt:
        sys.exit(1)

运行上面的代码,然后使用 “kill -3 <pid>” 给进程发 SIGQUIT 信号,此时进程并不会退出而是会继续运行,然后在 “/tmp” 下查看进程的详细输出文件,内容大致如下。

*** STACKTRACE - START ***

Thread ID: 140093508736832, Name: MainThread
  "test2.py", line 48, in <module>
    time.sleep(60)
  "test2.py", line 27, in signal_handler
    for filename, line_no, name, line in traceback.extract_stack(stack):

Thread ID: 140093324805888, Name: Thread-1
  "/usr/lib64/python2.7/threading.py", line 784, in __bootstrap
    self.__bootstrap_inner()
  "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
    self.run()
  "/usr/lib64/python2.7/threading.py", line 764, in run
    self.__target(*self.__args, **self.__kwargs)
  "test2.py", line 14, in test
    time.sleep(2)

*** STACKTRACE - END ***

从日志文件中可以看到每个线程名和ID,并且可以看到每个线程都正在做什么。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档