我需要从 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 关于工作进程生成子进程而不是线程的评论更新了我的答案:
芹菜worker
和worker 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 频道问那些特殊问题。通常有人非常了解这些,他们可以帮助你。