【问题标题】:Detect when threads are running in a python application?检测线程何时在 python 应用程序中运行?
【发布时间】:2010-02-28 18:04:27
【问题描述】:

我们如何检测线程何时在 python 应用程序中运行?

动机:我们最近调试了一个大型 Python 应用程序,该应用程序有几个客户提供的模块,这些模块没有提供源代码。我们(和我们的客户!)不知道,其中一个模块会在非常特定(且未记录)的条件下启动线程。这些线程导致了意想不到的副作用,以意想不到的方式改变了我们的环境。如果不是我的团队坚持找出副作用来自哪里的任务,整个调试场景会很有趣:)

当其中一个线程引发未捕获的错误时,我们终于发现了发生的事情。如果这没有发生,我们仍然会拔头发。

因此,这就是我们寻找一种方法来检测应用程序中是否存在线程的原因。

以下是我们提出的一些可能的技术以及相应的挑战:

  1. 用于线程/线程的 Grep 源代码。挑战:我们并不总是可以访问源代码。即使我们可以在源代码中找到线程创建的实例,我们仍然需要一种实时技术来检测线程当前何时处于活动状态。

  2. 在 sys.modules 中查找线程或线程。挑战:仅确保这些模块已加载 - 并不能证明线程当前正在运行。

  3. Monkey 为 Python 标准线程/线程库打补丁,为我们提供有关线程何时创建的线索。挑战:仅告诉我们是否已创建线程 - 不提供有关线程当前是否正在运行的任何信息。

谢谢! 马尔科姆

【问题讨论】:

  • 您是要查看线程列表还是查找创建额外线程的代码?
  • 另外,您确定客户提供的模块是通过python(通过thread/threading)创建线程吗?如果您没有源代码,这并不意味着是 .dll(或等效的),也不意味着 C 扩展?
  • 我们没有理由相信我们正在调试的代码有线程,所以我们没有寻找线程。我们正在调试的代码仅在非常不寻常且未记录的情况下创建线程,这就是我们感到惊讶的原因。在捕获了与他们的一个模块中的线程相关的未捕获异常后,我们终于从客户那里获得了源代码。

标签: python multithreading


【解决方案1】:

调试器

通常调试器可以显示所有线程以及每个线程正在执行什么。如果您告诉我们您使用的是哪个调试器,有人可以告诉您如何查看线程信息。如果您不使用调试器,我强烈建议您开始。在没有真正调试器的情况下调试多线程程序非常容易出错且效率低下。就个人而言,我使用WingIDE

运行时

如果您只是在解释器中四处寻找或尝试在代码中检测这种情况,也许sys._current_frames() 可能会有所帮助。它返回每个线程的堆栈帧。

【讨论】:

  • 你也可以看看threading._active,它是所有活动线程的字典。
  • Kyle:这正是我们想要的。谢谢你。 Eric:我们正在使用 Winpdb。感谢您对我的问题的帮助并花时间提供链接。
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多