在 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 工作人员,但是在使用
celery multi
时,如何在每个工作人员的基础上指定池实现,以便一个 worker 使用 gevent 池,而另一个 worker 使用 prefork?celery multi
文档没有提及有关此特定问题的任何内容,并且源代码( celery.bin.multi
)并未真正表明这是可能的(除非我误读/误解了代码)。
最佳答案
因此,目前指定每个 worker Pool 实现的唯一方法是运行独立的 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 脚本时变得困难 docs守护 celeryd。所以你要么修改 init.d 脚本,要么使用类似 Supervisor 的东西。
关于django - 将 gevent(或 eventlet)和 prefork worker 与 Celery 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29152712/