我们最近切换到Gunicorn使用GEVENT工人。
在我们的网站上,我们需要完成一些任务。超过30秒。
我们已经完成了整个芹菜工作,但是这些任务很少运行,以至于无法一直保持芹菜和Redis运行。我们只是不想那样。我们也不想按需开始芹菜和Redis。我们要摆脱它。(对此我感到抱歉,但我想避免这样的回答:“为什么不使用芹菜,太好了!”)
我说的是执行3000个SQL查询(插入)的任务,这些查询必须一个接一个地执行。这不是经常执行。我们也限制一次只能运行其中两个任务。他们应该花2-3分钟的时间。
现在,我们现在正在利用gevent worker和gevent.spawn
任务并返回响应。
我发现生成的线程实际上正在阻塞。返回响应后,任务将开始运行,并且在任务停止运行之前不会处理其他任何请求。任务将在30秒钟后被杀死timeout
。为了防止这种情况,我time.sleep()
在所有其他SQL查询之后使用,因此服务器有机会响应请求,但是我不觉得这是关键。
我们运行gunicorn,django并使用gevent。描述的行为发生在我的开发环境中,并使用1个gevent worker。在生产中,我们还将仅运行1个工人(目前)。另外,运行2个工作程序似乎在任务阻塞时无法帮助服务更多请求。
谢谢!
我已经决定使用一个synchronous
(标准)工作者并使用该multiprocessing
库。这似乎是目前最简单的解决方案。
我还实现了一个全局池,该池滥用memcached
提供锁定的缓存,因此只能运行两个任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句