使用 Celery 运行多个 worker

使用 Celery 运行多个 worker

我需要从 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] ...

似乎只有 1 个工作进程始终在运行。即按顺序一个接一个地运行。如何配置 Celery 以运行多个工作进程来并行运行?

答案1

现在,我根据 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

参考芹菜文档了解更多信息

答案2

看起来你的工作器只运行一个进程/线程。你可能只需要添加--concurrency-c论点当启动工作程序时产生多个(并行)工作程序实例。

celery -A proj worker -c 4

答案3

我发现这个

http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=parallel

您可以寻找画布基元在那里你可以看到如何创建并行执行的组。

class celery.group(task1[, task2[, task3[, … taskN]]]) 创建一组要并行执行的任务。

否则,一个好方法是去 IRC 频道问那些特殊问题。通常有人非常了解这些,他们可以帮助你。

相关内容