我们如何检测线程在python应用程序中运行的时间?
动机:我们最近调试了一个大型Python应用程序,该应用程序有几个客户提供的模块,这些模块没有源代码。对我们(以及我们的客户!)不感兴趣,其中一个模块将在非常特定(和未记录)的条件下启动线程。这些线程引起意想不到的副作用,以意想不到的方式改变了我们如果我的团队没有找到副作用的来源,那么整个调试场景会很有趣:)
我们终于发现了其中一个线程引发了一个未捕获的错误时发生了什么。如果没有发生这种情况,我们仍然会把头发拉出来。
因此,这就是为什么我们正在寻找一种方法来检测应用程序中是否存在线程。
以下是我们提出的一些可能的技术以及相应的挑战:
Grep线程/线程的源代码。挑战:我们并不总是能够访问源代码。即使我们可以在源代码中找到线程创建的实例,我们仍然需要一种实时技术来检测线程当前是否处于活动状态。
在sys.modules中查找线程或线程。挑战:只确保加载这些模块 - 不能证明线程当前正在运行。
Monkey-patch Python标准线程/线程库,为我们提供线程创建时的线索。挑战:仅告诉我们是否已创建线程 - 不提供有关线程当前是否正在运行的任何信息。
谢谢! 马尔科姆
答案 0 :(得分:6)
通常,调试器可以显示所有线程以及每个线程正在执行的内容。如果您告诉我们您正在使用哪个调试器,有人可以告诉您如何查看线程信息。如果您没有使用调试器,我强烈建议您开始使用。在没有真正的调试器的情况下调试多线程程序非常容易出错且效率低下。就个人而言,我使用WingIDE。
如果您只是在解释器中探索或尝试在代码中检测到这种情况,那么sys._current_frames()
可能会有所帮助。它返回每个线程的堆栈帧。