Swift51.com
麦子学院 头像
麦子学院  2018-04-18 15:15

Python3运行时查看线程信息的方法详解

回复:0  查看:2930  
本文和大家分享的主要是python3 运行时查看线程信息相关内容,在 python3 中引入faulthandler  模块,就可以简化我们很多工作,具体操作,下文将会为大家详细介绍,希望通过本文分享对大家 学习python3有所帮助。
  先准备一个小程序,就是周期性的往命令行终端输出一下时间,如下:
  #!/usr/bin/env python# -*- coding: utf-8 -*- 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)
   if __name__ == "__main__":
   try:
  threading.Thread(target=test).start()
   while  True:
  time.sleep(60)
   except KeyboardInterrupt:
  sys.exit(1)
  要启用 dump thread  的功能,可以通过三种方式来打开:
  1.  使用  PYTHONFAULTHANDLER=true  环境变量
  2.  使用  python3 -q -X faulthandler  来起用
  3.  代码方式来启用
  这里我们通过设置环境变量 “PYTHONFAULTHANDLER=true”  来启用,用下面方式运行程序:
  $ PYTHONFAULTHANDLER=true ./test.py
  然后在另开一个终端运行下面的命令
  $ kill -SIGABRT ` ps -ef |  grep test. py |  grep -v 'grep' | awk '{print $2}'`
  此时我们可以在运行 test.py  的终端中看到如下线程信息:
  Fatal Python error: Aborted
  Thread 0x00007f8298430700 (most recent  call  first):
   File "./test3.py", line 16  in  test
   File "/usr/lib64/python3.4/threading.py", line 859  in run
   File "/usr/lib64/python3.4/threading.py", line 911  in _bootstrap_inner
   File "/usr/lib64/python3.4/threading.py", line 879  in _bootstrap
   Current  thread 0x00007f82a2fcf740 (most recent  call  first):
   File "./test3.py", line 24  in < module>
  Aborted (core dumped)
  这里我们是通过发送 SIGABRT  信号来触发的,其实也可以使用  SIGSEGV, SIGFPE, SIGABRT, SIGBUS  和  SIGILL  信号来出发。
  运行上面的程序,我们发现一个问题,一旦dump threads 后,进程就退出了,而如果我们不想让进程退出,该怎么办呢,这就要用到前一篇文章中说提到的复写信号处理函数了。
  看一下下面的代码,我们和前一篇博客中一样都是复写 “SIGQUIT”  信号处理函数,在接受到  SIGQUIT  信号后,输出线程信息到  /tmp  目录下,然后程序继续运行。
  #!/usr/bin/env /usr/bin/python3.4# -*- coding: utf-8 -*- import os import sys import threading import traceback import signal import tempfile from datetime  import datetime import time import faulthandler
   def  test():
   while  True:
  print(datetime.now())
  time.sleep(2)
   def  signal_handler(signum, frame):
   try:
  file = os.path.join(tempfile.gettempdir(), datetime.now().strftime('%Y%m%d%H%M%S') + ".log")
   with open(file, 'w+')  as f:
  faulthandler.dump_traceback(file=f, all_threads= True)
   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)
  运行上面的程序,并使用下面的命令来给进程发 SIGQUIT  信号
  $ kill -SIGQUIT ` ps -ef |  grep test. py |  grep -v 'grep' | awk '{print $2}'`
  然后可以在 /tmp  目录下找到输出的线程日志,内容如下,同时我们也可以看到程序会继续执行下去而不会推出。
  Thread 0x00007f13d75d2700 (most recent  call  first):
   File "./test3.py", line 17  in  test
   File "/usr/lib64/python3.4/threading.py", line 859  in run
   File "/usr/lib64/python3.4/threading.py", line 911  in _bootstrap_inner
   File "/usr/lib64/python3.4/threading.py", line 879  in _bootstrap
   Current  thread 0x00007f13e2171740 (most recent  call  first):
   File "./test3.py", line 24  in signal_handler
   File "./test3.py", line 36  in < module>
来源:网络