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

Ami*_*deh 5 django concurrency celery gevent eventlet

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

...将Eventlet和prefork工作者混合使用,并根据兼容性或最佳效果来路由任务

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

这意味着可以让一个worker使用gevent/eventlet池实现,而另一个使用prefork池.

使用以下命令创建多个工作程序时,可以指定池实现celery multi:

celery -A proj multi start 2 -P gevent -c 1000
Run Code Online (Sandbox Code Playgroud)

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

celery multi文档没有提到关于该特定事项中任何东西,和源代码(celery.bin.multi)并没有真正证明这是可能的(除非我误解/误解的代码).

Ami*_*deh 6

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

$ celery -A proj worker start -P gevent -Q:queue1 -c 500
$ celery -A proj worker start -P prefork -Q:queue2 -c 4
Run Code Online (Sandbox Code Playgroud)

celery multi不支持-P:worker1 gevent, -P:worker2 prefork。当使用 Celery文档中提供的 init.d 脚本来守护 celeryd 时,这会让事情变得困难。所以你要么必须修改 init.d 脚本,要么使用类似 Supervisor 的东西。