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

Using both gevent (or eventlet) and prefork workers with Celery

在 Celery 文档的并发部分,它指出:

...mix of both Eventlet and prefork workers, and route tasks according to compatibility or what works best

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

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

使用 celery multi:

创建多个 worker 时可以指定池实现
celery -A proj multi start 2 -P gevent -c 1000

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

celery multi 文档没有提及任何关于这个具体问题的内容,源代码 (celery.bin.multi) 也没有真正表明这是可能的(除非我 misread/misunderstood代码)。

因此,目前指定每个工作池实现的唯一方法是通过 运行 独立的 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 的东西。

有一种方法可以使用 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 选项。

在上面的示例中,celery 创建了一个具有 gevent 池限制为 1000 的工作人员和一个具有默认进程限制的 prefork 工作人员。

更多示例here