代码之家  ›  专栏  ›  技术社区  ›  duong_dajgja

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

  •  0
  • duong_dajgja  · 技术社区  · 6 年前

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

    1. 一个提取线程:每1秒对700个文件进行一次迭代,获取数据,然后将获取的数据发送到所谓查询池的共享队列。

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

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

    大多数情况下,程序运行良好,但如果有一个查询需要花费大量时间(由于服务器响应延迟),那么整个后续查询都会受到显著影响。

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

    我的问题是:

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

    2. 格温特 帮我解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sraw    6 年前

    对于你的第一个问题,看起来不太清楚。你应该首先找出瓶颈在哪里。

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

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

    第二个问题, gevent 如果是网络造成的,这会对你有很大帮助。

        2
  •  0
  •   eatmeimadanish    6 年前

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