在多线程python中找到cpu-hogging插件

its*_*dok 8 python regex multithreading profiling

我有一个用python编写的系统,它使用由具有不同经验水平的几个开发人员编写的插件处理大量数据.

基本上,应用程序启动多个工作线程,然后为它们提供数据.每个线程确定用于项目的插件并要求它处理该项目.插件只是一个定义了特定功能的python模块.处理通常涉及正则表达式,并且不应超过一秒左右.

有时候,其中一个插件需要几分钟才能完成,整个时间将CPU挂起100%.这通常是由次优正则表达式与暴露低效率的数据项配对引起的.

这是事情变得棘手的地方.如果我怀疑罪魁祸首是谁,我可以检查它的代码并找到问题所在.但是,有时我不是那么幸运.

  • 我不能去单线程.如果我这样做,可能需要数周才能重现问题.
  • 在插件上放置一个计时器没有用,因为当它冻结时需要使用GIL,所有其他插件也需要几分钟才能完成.
  • (如果您想知道,SRE引擎不会释放GIL).
  • 据我所知,分析在多线程时是无用的.

没有将整个架构重写为多处理,我可以通过任何方式找出谁在吃掉我所有的CPU?

补充:回答一些评论:

  1. 在python中分析多线程代码是没有用的,因为分析器测量总函数时间而不是活动cpu时间.试试cProfile.run('time.sleep(3)')看看我的意思.(归功于rog [最后评论]).

  2. 而之所以会单线程是棘手的,因为只有1 20,000项导致的问题,我不知道它是哪一个.运行多线程允许我在大约一个小时内完成20,000个项目,而单线程可能需要更长的时间(涉及很多网络延迟).还有一些我现在不想进入的并发症.

也就是说,尝试序列化调用插件的特定代码并不是一个坏主意,因此一个的时序不会影响其他的时序.我会尝试并报告回来.

wr.*_*wr. 0

正如你所说,由于 GIL,它不可能在同一进程中。

我建议启动第二个监视器进程,该进程监听原始应用程序中另一个线程的生命周期。一旦该时间节拍在指定的时间内丢失,监视器就可以终止您的应用程序并重新启动它。