在CTRL + C python程序之后找出仍在运行的内容

时间:2016-01-03 04:54:33

标签: python multithreading multiprocessing pdb

在我用CTRL + C杀死python程序之后,我发现大多数线程和进程已经终止(他们正在看一些标志),但仍有一些在后台运行而没有任何输出到控制台。有没有办法可以调查哪一个还在运行?

如果你建议在线程/进程运行时打印一些内容,它似乎无法正常工作。首先,一些线程/进程在第三方库中运行方法,例如websocket.run_forever。其次,对于那些运行我的方法的线程/处理,我很确定它们正在监视一个标志,一旦它被设置,它们都会退出。对于那些运行第三方方法的线程/进程,我调用一些方法来终止它们,比如websocket.close(),我确实看到它们被终止了。所以在这种情况下,让我感到困惑的是仍在运行的东西。

2 个答案:

答案 0 :(得分:0)

您可以调用这个精彩的dumpstacks函数,它会打印所有正在运行的线程的当前回溯。

如果您的主线程(或您控制下的其他线程)仍然在该点运行(例如,在退出之前等待其他线程完成),请在那里添加函数调用。

另一种选择是将pdb调试器附加到正在运行的进程,然后运行dumpstacks

这应该可以让你非常清楚仍然在运行什么。

答案 1 :(得分:0)

这是我最终做的。它没有直接回答问题,但它解决了我的问题。

首先,在我按CTRL + C程序之后,我做了一个

ps aux | grep -i "myProgram.py"

并发现只有一个进程仍在运行(在CTRL + C之前超过五个)。

下一步,我创建了我在程序“daemon”中创建的所有线程,尤其是那些在主进程中运行的线程。

然后,我做

threads = threading.enumerate()
for _t in threads:
  print _t.name
  print _t.isAlive()
  print _t.isDaemon()

以便在我捕获KeyboardInterrupt(来自CTRL + C)之后找出仍在运行的任何内容并进行清理(设置线程/进程终止标志)。

现在程序在CTRL + C之后正常存在,并且没有任何东西在后台继续运行。