首页 > 解决方案 > 如何提高多线程 python 程序的性能?

问题描述

我制作了一个 python 程序,它定期(间隔 1 秒)从约 700 个文件中抓取一些数据,并使用抓取的数据查询服务器。单个查询的响应时间通常约为 2 ~ 3 毫秒,但在某些情况下可能需要 200 毫秒。该计划包括:

  1. 一个提取线程:每 1 秒迭代 700 多个文件,抓取数据,然后将抓取的数据分派到所谓的查询池的共享队列中。

  2. N 个线程池:每个线程从共享队列中挑选数据并将查询发送到服务器。

当 N 为 4 时,程序显示出最佳性能。如果我将 N 增加到 8,那么性能会显着下降。我想这是因为 python 的 GIL。

大多数时候程序运行良好,但如果有一个查询需要很长时间(由于服务器响应较晚),那么整个后续查询都会受到极大影响。

我真的很想利用线程,所以我一直在研究,gevent但不确定它是否有帮助。

我的问题:

  1. 我目前的设计看起来如何?有更好的设计吗?

  2. gevent帮助解决这个问题吗?

标签: pythonpython-2.7geventgil

解决方案


对于您的第一个问题,看起来还不清楚。您应该首先弄清楚瓶颈在哪里。

如果我理解正确,每 1 秒你的提取线程将 700 个任务添加到队列中,然后每个工作线程只接受其中一个任务并向远程服务器发送请求。我对吗?

在这种情况下,网络是否会导致速度变慢?你能确认一下吗?如果您认为GIL在使用更多线程时会导致性能不佳,这是否意味着您的程序中存在一些计算瓶颈?

然后对于您的第二个问题,gevent如果速度变慢是由网络引起的,将对您有很大帮助。


推荐阅读