如何提高多线程 python 程序的性能?

How can I improve performance of my multi-threaded python program?

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

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

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

当 N 为 4 时,程序表现出最佳性能。如果我将 N 增加为 8,那么性能会显着下降。我猜这是因为 python.

的 GIL

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

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

我的问题:

  1. 我现在的设计怎么样?有更好的设计吗?

  2. gevent可以解决这个问题吗?

你的第一个问题,好像不清楚。你首先要弄清楚瓶颈在哪里

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

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

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

您应该考虑使用 GIPC https://gehrcke.de/gipc/ 作为一种避免 GIL 并利用多个 CPU 的方法,同时仍然保持交叉通信。