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

时间:2018-06-01 07:00:00

标签: python python-2.7 gevent gil

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

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

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

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

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

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

    我的问题:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

然后对于你的第二个问题,如果减速是由网络造成的,gevent会对你有所帮助。

答案 1 :(得分:0)

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