gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:09:11 26 4
gpt4 key购买 nike

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

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

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

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

  • 我不能使用单线程。如果我这样做,可能需要 数周 才能重现该问题。
  • 在插件上放置一个计时器没有帮助,因为当它卡住时它会带走 GIL,而所有其他插件也需要几分钟才能完成。
  • (如果您想知道,SRE engine doesn't release the GIL)。
  • 据我所知profiling在多线程时非常无用。

如果不将整个架构重写为多处理,我有什么办法可以找出谁在占用我所有的 CPU?

已添加:在回答一些评论时:

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

  2. 单线程之所以棘手,是因为 20,000 项中只有一项导致了问题,而且我不知道是哪一项。运行多线程允许我在大约一个小时内处理 20,000 个项目,而单线程可能需要更长的时间(涉及大量网络延迟)。还有一些我现在不想讨论的并发症。

也就是说,尝试序列化调用插件的特定代码是个不错的主意,这样一个插件的时序就不会影响其他插件的时序。我会尝试并报告。

最佳答案

你显然不需要多线程,只需要并发,因为你的线程不共享任何状态:

尝试多处理而不是多线程

单线程/N个子进程。在那里你可以为每个请求计时,因为没有 GIL 被保留。

另一种可能性是摆脱多个执行线程并使用基于事件的网络编程(即使用扭曲)

关于python - 在多线程python中查找cpu-hogging插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com