【发布时间】:2010-02-28 18:04:27
【问题描述】:
我们如何检测线程何时在 python 应用程序中运行?
动机:我们最近调试了一个大型 Python 应用程序,该应用程序有几个客户提供的模块,这些模块没有提供源代码。我们(和我们的客户!)不知道,其中一个模块会在非常特定(且未记录)的条件下启动线程。这些线程导致了意想不到的副作用,以意想不到的方式改变了我们的环境。如果不是我的团队坚持找出副作用来自哪里的任务,整个调试场景会很有趣:)
当其中一个线程引发未捕获的错误时,我们终于发现了发生的事情。如果这没有发生,我们仍然会拔头发。
因此,这就是我们寻找一种方法来检测应用程序中是否存在线程的原因。
以下是我们提出的一些可能的技术以及相应的挑战:
用于线程/线程的 Grep 源代码。挑战:我们并不总是可以访问源代码。即使我们可以在源代码中找到线程创建的实例,我们仍然需要一种实时技术来检测线程当前何时处于活动状态。
在 sys.modules 中查找线程或线程。挑战:仅确保这些模块已加载 - 并不能证明线程当前正在运行。
Monkey 为 Python 标准线程/线程库打补丁,为我们提供有关线程何时创建的线索。挑战:仅告诉我们是否已创建线程 - 不提供有关线程当前是否正在运行的任何信息。
谢谢! 马尔科姆
【问题讨论】:
-
您是要查看线程列表还是查找创建额外线程的代码?
-
另外,您确定客户提供的模块是通过python(通过
thread/threading)创建线程吗?如果您没有源代码,这并不意味着是 .dll(或等效的),也不意味着 C 扩展? -
我们没有理由相信我们正在调试的代码有线程,所以我们没有寻找线程。我们正在调试的代码仅在非常不寻常且未记录的情况下创建线程,这就是我们感到惊讶的原因。在捕获了与他们的一个模块中的线程相关的未捕获异常后,我们终于从客户那里获得了源代码。
标签: python multithreading