在Celery文档的并发部分中,它声明:
Eventlet和预工作人员的混合,并根据兼容性或最有效的
来源: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工作线程,但在使用celery multi
时,如何在每个工作线程的基础上指定池实现,以便一个工作线程使用gevent池,另一个使用prefork?
celery multi
文档没有提到任何关于这一特定问题的内容,源代码(celery.bin.multi
)也没有真正表明这是可能的(除非我误读/误解了代码)。
因此,目前指定每个工作池实现的唯一方法是运行独立的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文档中提供的init.d脚本来守护celeryd时变得困难。因此,您要么必须修改init.d脚本,要么使用类似Supervisor的东西。
有一种方法可以使用celery multi
启动不同的实现。正如Amir R.所说的-Q
选项。
celery multi start 2 -A default_prefork_queue -Q:2 gevent_queue_name -P:2 gevent -c:2 1000
默认情况下,它是选定的prefork
选项。
在上面的示例中,芹菜创建了一个具有1000限制的gevent
池的工作线程,以及一个具有默认进程限制的prefork
工作线程。
此处的更多示例