我有一些关于任务路由、并发性和性能的问题。 这是我的用例:
我有一台专用服务器来运行 celery 任务,因此我可以使用所有 CPU 在此服务器上运行 celery 工作程序。
我有很多不同的 python 任务,我使用 CELERY_ROUTES 进行路由,并且因为这些任务执行真正不同类型的 python 代码,所以我创建了 5 个不同的工作线程。 这些工作人员是在我使用 ansible 部署项目时创建的,下面是一个示例:
[program:default_queue-celery]
command={{ venv_dir }}/bin/celery worker --app=django_coreapp --loglevel=INFO --concurrency=1 --autoscale=15,10 --queues=default_queue
environment =
SERVER_TYPE="{{ SERVER_TYPE }}",
DB_SCHEMA="{{ DB_SCHEMA }}",
DB_USER="{{ DB_USER }}",
DB_PASS="{{ DB_PASS }}",
DB_HOST="{{ DB_HOST }}"
directory={{ git_dir }}
user={{ user }}
group={{ group }}
stdout_logfile={{ log_dir }}/default_queue.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
redirect_stderr=true
autostart=true
autorestart=true
startsecs=10
killasgroup=true
我在 settings.py 中还有一个 CELERY_QUEUES 来在 CELERY_ROUTES 和我的 celery 程序(队列)之间架起桥梁
CELERY_DEFAULT_QUEUE = 'default_queue'
如果我没有路由任务,它将进入我的“default_queue”
为了给所有队列提供空间,我将 default_queue 的 --concurrency 设置为 1,并将最重要的队列设置为更多。
但我想知道,AutoScale 对并发性的影响是否相同?意思是,如果我将并发设置为 1 并将 --autoscale 设置为 15,10(上面的示例)
我的工作线程会在 CPU 上“工作”并在此 CPU 上最多处理 15 个任务吗? 或者这是否意味着完全不同的东西?
最佳答案
同时设置并发
和自动缩放
是没有意义的,因为两者都是控制给定工作实例的工作子进程数量的方法,as explained here 。
--concurrency N
意味着您的工作实例将拥有 N 个工作子进程(意味着工作实例可以处理 N 个并发任务)。
--autoscale max, min
表示对于给定的工作实例,您将至少拥有 min
且最多 max
个并发工作子进程。
每个进程(主工作进程或其任何子子进程)将在哪个 CPU 上运行是不可预测的,这是操作系统的问题,但不要假设子进程都将在同一个 CPU 上运行(很可能它们不会- 这实际上是并发子进程的一部分)。
关于python - CELERYD_CONCURRENCY, --并发和自动缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44903253/