使用芹菜运行多个工人


11

我需要从Rabbitmq中读取并使用Celery在单个系统中并行执行任务。

[2014-12-30 15:54:22,374: INFO/Worker-1] ...   
[2014-12-30 15:54:23,401: INFO/Worker-1] ...
[2014-12-30 15:54:30,878: INFO/Worker-1] ...
[2014-12-30 15:54:32,209: INFO/Worker-1] ...
[2014-12-30 15:54:33,255: INFO/Worker-1] ...
[2014-12-30 15:54:48,445: INFO/Worker-1] ...
[2014-12-30 15:54:49,811: INFO/Worker-1] ...
[2014-12-30 15:54:50,903: INFO/Worker-1] ...
[2014-12-30 15:55:39,674: INFO/Worker-1] ...
[2014-12-30 15:55:41,024: INFO/Worker-1] ...
[2014-12-30 15:55:42,147: INFO/Worker-1] ...

它仅接缝始终有一名工人在运行..即,依次接一个接一个地工作。如何配置Celery以运行多个工作程序以并行运行?

Answers:


17

我现在根据MartinP关于工人产生子进程而非线程的评论更新了答案。

芹菜workerworker processes是不同的东西(请阅读以供参考)。

当工人开始工作时,它会产生一定数量的子进程。

这些进程的默认数量等于该计算机上的内核数量。

在Linux上,您可以通过以下方法检查内核数:

$ nproc --all

否则,您可以自己指定它,例如:

$ celery -A proj worker --loglevel=INFO --concurrency=2

在上面的示例中,有一个工作程序将能够生成2个子进程。通常建议每台计算机运行一个工作进程,并发值将定义并行运行多少个进程,但是如果需要多个工作进程运行,则可以如下所示启动它们:

$ celery -A proj worker -l info --concurrency=4 -n wkr1@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr2@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr3@hostname

有关更多信息,请参考celery 文档


3
concurency参数不运行线程。它默认运行子进程,因此可以并行处理任务-docs.celeryproject.org/en/latest/reference/…–
MartinP

并发与线程如何相互关联,如果默认的并发是计算机的内核数,那么线程数将是多少?它是可配置的吗?
Thomas John

@ThomasJohn我认为线程的默认数量仍然是机器的核心数量。通常,您需要为基于线程的工作程序将--concurrency标志设置为高。
FragLegs


0

看起来您的工作人员仅在运行一个进程/线程。启动工作程序以生成多个(并行)工作程序实例时,您可能只需要添加--concurrencyor -c参数

celery -A proj worker -c 4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.