Python2运行时查看线程信息

今天遇见一个 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,并且可以看到每个线程都正在做什么。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python3运行时查看线程信息

    kongxx
  • TensorFlow 分布式集群

    kongxx
  • Ubuntu安装软件包时报错: Failed to fetch ...deb

    删除 /var/lib/apt/lists/partial 目录下的所有文件,然后运行apt-get update。

    kongxx
  • python+shell 备份 csdn 博客文章

    前面,我们将所有的博客文章全部备份下来了。但是,博客当中的那些图片,还是散落在各处。有的在第三方的网站上,有的在 CSDN 的服务器上,有的直接引用的其他地方的...

    FungLeo
  • 高质量代码-智慧城市GIS平台后端代码

    《高质量代码-智慧城市GIS平台数据表设计》一文介绍了项目中的数据库表设计。此文介绍优良合理的表设计给后端接口开发带来的便利性。

    MiaoGIS
  • C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重的地位。

    程序员小高
  • 强悍的 Python —— 读取大文件

    Python 环境下文件的读取问题,请参见拙文 Python 基础 —— 文件

    py3study
  • 基于Opendaylight的packet-in flooding攻击的检测与防护

    作者简介:智智方,西安电子科技大学硕士研究生,主要研究方向为SDN与网络安全,邮箱:675520574@qq.com

    SDNLAB
  • 移动机器人,移动的目标?

    移动机器人,移动的目标 NIST的研究揭示了开发工业移动机器人安全标准的复杂性。为自主移动平台设计安全标准是一回事,但现在添加机器人手臂或其他类型的附件,无论...

    机器人网
  • 云服务安全隐患是企业选择云的最大障碍

    根据云安全联盟的年度调查显示,虽然企业及其员工正在越来越多的使用云计算服务,但企业高管仍然担心业务数据存储在云计算中所涉及的安全隐患。 这个“云部署做法和重点调...

    静一

扫码关注云+社区

领取腾讯云代金券