Gunicorn,Django,Gevent:Spawned线程正在阻塞

enp*_*nax 6 python django multithreading gevent gunicorn

我们最近切换到Gunicorn使用GEVENT工人.

在我们的网站上,我们有一些需要一段时间才能完成的任务.超过30秒.

前言

我们已经完成了整个芹菜的事情,但这些任务很少运行,以至于不能让芹菜和redis一直运行.我们只是不想那样.我们也不想按需开始芹菜和红葡萄酒.我们想要摆脱它.(我为此感到抱歉,但我想阻止这样的答案:"为什么不使用芹菜,这太好了!")

我们想要异步运行的任务

我说的是执行3000个SQL查询(插入)的任务,这些查询必须一个接一个地执行.这种情况并非经常发生.我们仅限于同时运行其中两项任务.他们应该花2-3分钟.

该方法

现在,我们现在正在做的是利用gevent worker和gevent.spawn任务并返回响应.

问题

我发现生成的线程实际上是阻塞的.一旦返回响应,任务就会开始运行,并且在任务停止运行之前不会处理任何其他请求.任务将在30多岁后被枪杀timeout.为了防止这种情况,我time.sleep()在每个其他SQL查询之后使用,因此服务器有机会响应请求,但我不觉得这是重点.

设置

我们运行gunicorn,django并使用gevent.描述的行为发生在我的开发环境中并使用1 gevent worker.在生产中,我们也只运行一名工人(现在).此外,在任务阻塞时,运行2名工作人员似乎无助于提供更多请求.

TLDR

  • 我们认为在我们的2分钟任务中使用gevent线程是可行的(芹菜上)
  • 我们使用gunicorn和gevent,并想知道为什么用gevent.spawn产生的线程阻塞
  • 是阻止意图还是我们的设置错了?

谢谢!

enp*_*nax -2

我已经决定使用synchronous(标准)工人并使用图书馆multiprocessing。这似乎是目前最简单的解决方案。

我还实现了一个全局池,滥用memcached提供锁的缓存,因此只能运行两个任务。

  • 这并不能回答问题。 (2认同)