6

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

... 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 工作人员,但是我如何在使用时基于每个工作人员指定池实现celery multi,以便一个工作人员使用 gevent 池而另一个使用 prefork?

celery multi文档没有提到任何关于这个特定问题的内容,源代码 ( )celery.bin.multi并没有真正表明这是可能的(除非我误读/误解了代码)。

4

2 回答 2

4

所以目前指定每个工作池实现的唯一方法是运行独立的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 之类的东西。

于 2015-03-20T18:38:42.843 回答
2

有一种方法可以使用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工作人员和一个具有默认进程限制的工作人员。

更多示例在这里

于 2017-01-09T10:09:20.090 回答