如何检测Python应用程序中线程是否在运行?
我们怎么能知道在一个Python应用程序中线程是否正在运行呢?
动机:最近我们在调试一个大型的Python应用程序,这个程序有几个客户提供的模块,但这些模块没有源代码。我们和客户都不知道,其中一个模块在非常特定(而且没有文档说明)的条件下会启动线程。这些线程导致了一些意想不到的副作用,改变了我们的环境,让我们很困惑。如果不是我团队在努力搞清楚这些副作用的来源,这整个调试过程可能会变得很搞笑 :)
我们最终发现了问题的根源,是因为其中一个线程抛出了一个没有被捕获的错误。如果没有这个错误,我们可能还在苦苦挣扎。
所以,这就是我们想找办法检测应用程序中线程存在的原因。
以下是我们想到的一些可能的方法,以及相应的挑战:
在源代码中搜索线程或线程库。挑战:我们并不总是能访问源代码。即使我们能在源代码中找到线程创建的地方,我们仍然希望有一种实时的方法来检测线程是否正在活动。
在sys.modules中查找线程或线程库。挑战:这只能确保这些模块已经加载,但并不能证明线程当前正在运行。
对Python标准的线程/线程库进行猴子补丁,以便给我们留下线程创建的线索。挑战:这只能告诉我们线程是否被创建,但并不能提供线程当前是否正在运行的信息。
谢谢!
马尔科姆
1 个回答
6
调试器
通常,调试器可以显示所有的线程,以及每个线程正在执行的内容。如果你告诉我们你使用的是哪个调试器,可能会有人告诉你怎么查看线程信息。如果你还没有使用调试器,我强烈建议你开始使用。没有真正的调试器来调试多线程程序是很容易出错的,而且效率也低。我个人使用的是WingIDE。
运行时
如果你只是想在解释器里随便看看,或者试图在你的代码中检测这种情况,也许sys._current_frames()
会对你有帮助。这个方法会返回每个线程的堆栈帧信息。