python中有没有像java中的jstack命令

最近有个应用中用到了多线程执行某个任务,但是程序有时候就不动,排查出原因就是开启的新线程卡在哪里了,但是又不知道原因。在jvm中可以jstack pid导出当前进程的所有vm线程状态,请问在python在有这个功能吗,谢谢!

thread = Thread(target=util.do_import, args=(keywords, category, businessType, country))
thread.start()
阅读 9.4k
3 个回答

没有像jstack那么方便直接用的东西,一般来说有几个方案:

  • IDE: 用诸如 PyCharm, Eclpise with Pydev 的工具调试,觉得挂起的时候暂停并检查各个调用栈。
  • GDB: 优点是可以调试到native extension,缺点也很明显,需要在编译Python的时候加上Debug Symbols,默认这个是没有的。简单的说就是功能强大但是配得麻烦。
  • pdb:适合下断点...
  • pudb: 改下代码,在程序入口import pudb; pudb.set_interrupt_handler(),在运行的时候就可以Ctrl-C进入到交互式调试环境,易用性还好吧。
  • 撸一个singal handler用于打印所有栈信息,参考 celery 实现的 install_cry_handler,或者看看 signalhandler,这个在 Python 3.3 自带了。

NOTE: 所有依赖signal的方案,有个缺点就是,POSIX有很多函数会在这些中断产生时,返回EINTR,直接导致 Python 异常,比如send, recv, read, write 等等。。。

我不懂 Java,所以不清楚你想要的是什么。你是想打印出所有线程的调用栈吗?好像不容易的样子。

我一般是:

  1. 尽量避免使用线程
  2. 打印日志。这样可以大致推断出线程在哪里卡住了
  3. strace 到各个线程上检查,看看它们卡在什么系统调用上了
新手上路,请多包涵

python直接用多线程貌似是不行的 因为有个叫GIL的东西 至于你想看线程情况 可以用pdb调试 试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏