在Celery中使用gevent(或eventlet)和prefork工作者

时间:2015-03-19 18:50:52

标签: django concurrency celery gevent eventlet

在Celery文档的Concurrency部分中,它声明:

  

...将Eventlet和prefork工作者混合起来,并按照路由任务   兼容性或最佳效果

来源:http://celery.readthedocs.org/en/latest/userguide/concurrency/eventlet.html#concurrency-eventlet

这意味着可以让工作人员使用gevent / eventlet池实现,而另一个人使用prefork池。

使用celery multi

创建多个工作人员时,可以指定池实施
celery -A proj multi start 2 -P gevent -c 1000

这会启动2个gevent worker,但是如何在使用celery multi时基于每个worker指定池实现,以便一个worker使用gevent池而另一个使用prefork?

celery multi文档没有提及有关此特定事项的任何内容,而源代码(celery.bin.multi)并未真正表明这是可能的(除非我误读/误解)代码)。

2 个答案:

答案 0 :(得分:3)

因此,目前指定每个工作池实现的唯一方法是运行独立的celery worker命令:

$ celery -A proj worker start -P gevent -Q:queue1 -c 500
$ celery -A proj worker start -P prefork -Q:queue2 -c 4

celery multi不支持-P:worker1 gevent, -P:worker2 prefork。当使用Celery docs中提供的init.d脚本来守护celeryd时,这会很困难。因此,您必须修改init.d脚本或使用Supervisor之类的东西。

答案 1 :(得分:1)

有一种方法可以使用celery multi启动不同的实现。就像Amir R.关于-Q选项所说的那样。

celery multi start 2 -A dmail_vk -Q:2 gevent_queue_name -P:2 gevent -c:2 1000

默认选择prefork选项。

在上面的例子中,芹菜创建了一个具有gevent池的工人,其中1000个限制,一个prefork工人具有默认的处理限制。

更多示例here