在Celery中同时使用gevent(或eventlet)和prefork workers



在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工作线程。

此处的更多示例

相关内容

  • 没有找到相关文章

最新更新