我制作一个python程序,定期(间隔1秒)从~700个文件中获取一些数据,并使用抓取的数据查询服务器。对于单个查询,响应时间通常约为2~3毫秒,但在某些情况下,最多可能需要200毫秒。该计划包括:
一个提取线程:每1秒迭代700多个文件,抓取数据,然后将抓取的数据发送到所谓的查询池的共享队列。
N个线程的池:每个线程从共享队列中选择数据并将查询发送到服务器。
当N为4时,程序显示最佳性能。如果我将N增加到8则性能会显着下降。我想这是因为python的GIL。
大多数时候程序运行良好但是如果查询需要花费很多时间(由于服务器响应较晚),那么整个后续查询都会受到严重影响。
我真的想利用线程,所以我一直在关注gevent
,但不确定它是否有帮助。
我的问题:
我目前的设计如何?有更好的设计吗?
gevent
会帮助解决这个问题吗?
答案 0 :(得分:1)
对于你的第一个问题,看起来不太清楚。你应该首先弄清楚瓶颈在哪里。
如果我理解正确,每1秒你的提取线程就会将700个任务添加到队列中,然后每个工作线程只需执行其中一个任务并向远程服务器发送请求。我是对的吗?
在这种情况下,网络会导致速度变慢吗?你能证实一下吗?如果您认为GIL
在使用更多线程时导致性能不佳,那是否意味着您的程序存在一些计算瓶颈?
然后对于你的第二个问题,如果减速是由网络造成的,gevent
会对你有所帮助。
答案 1 :(得分:0)
您应该考虑使用GIPC https://gehrcke.de/gipc/作为避免GIL并利用多个CPU的方法,但仍然保留交叉通信。