基本上,应用程序启动几个工作线程,然后提供数据。每个线程确定要为项目使用哪个插件,并要求其处理该项目。插件只是具有特定函数定义的Python模块。处理通常涉及正则表达式,不应超过一秒钟左右。
偶尔,其中一个插件需要数分钟才能完成,将CPU占用率保持在100%。这通常是由于子优化的正则表达式与暴露该低效性的数据项配对导致的。
这就是事情变得棘手的地方。如果我怀疑是谁干的,我可以检查它的代码并找到问题。但是,有时我就没有那么幸运。
- 我不能使用单线程。如果这样做,可能需要数周时间才能重现该问题。
- 在插件上放置计时器没有帮助,因为当它冻结时,它会带走GIL,并且所有其他插件也需要几分钟才能完成。
- (如果你想知道,SRE引擎不释放GIL)。
- 据我所知,分析 在多线程时几乎没什么用。
除了将整个架构重写成多进程外,我有什么办法可以找出谁在占用我的CPU?
补充:回答一些评论:
在Python中对多线程代码进行剖析并没有什么用,因为剖析器测量的是总函数时间而不是活跃CPU时间。尝试cProfile.run('time.sleep(3)')以了解我的意思。(参考rog [最后一条评论])。
之所以单线程处理比较棘手,是因为20,000个项目中只有1个项目引起了问题,我不知道是哪一个。多线程运行可以在大约一个小时内处理完20,000个项目,而单线程处理可能需要更长时间(涉及很多网络延迟)。这里还有一些更复杂的情况,我现在不想深入讨论。
话虽如此,尝试串行化调用插件的特定代码也不失为一个好主意,这样一个插件的时间不会影响其他插件的时间。我会尝试并回报结果。