在 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
在 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
:
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