Min*_*han 1 python django concurrency multithreading celery
我有几个关于任务路由、并发性和性能的问题。这是我的用例:
我有一台专用服务器来运行 celery 任务,因此我可以使用所有 CPU 在该服务器上运行 celery 工作程序。
我有很多不同的 python 任务,我使用:CELERY_ROUTES 进行路由,因为这些任务执行真正不同类型的 python 代码,我创建了 5 个不同的 worker。这些工作器是在我使用 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
Run Code Online (Sandbox Code Playgroud)
我在 settings.py 中还有一个 CELERY_QUEUES 来在 CELERY_ROUTES 和我的芹菜程序(队列)之间架起桥梁
CELERY_DEFAULT_QUEUE = 'default_queue'
Run Code Online (Sandbox Code Playgroud)
如果碰巧我没有路由任务,它将转到我的“default_queue”
为了给我的所有队列留出空间,我将 default_queue 的 --concurrency 设置为 1,并将我最重要的队列设置为更多。
但我想知道, AutoScale 对与 concurrency 相同的价值有影响吗?意思是,如果我将并发设置为 1 并将 --autoscale 设置为 15,10(上面的示例)
我的工人会在 CPU 上“工作”并在这个 CPU 上处理最多 15 个任务吗?或者这是否意味着完全不同的东西?
设置两者是没有意义的concurrency,autoscale因为两者都是控制给定工作实例的工作子进程数量的手段,如此处所述。
--concurrency N 意味着您的工作实例将有 N 个工作子进程(意味着工作实例可以处理 N 个并发任务)。
--autoscale max, min意味着对于给定的工作实例,您将至少有min最多 max并发工作子进程。
每个进程(主工作进程或其任何子进程)将在哪个 CPU 上运行是不可预测的,这是操作系统的事情,但不要假设子进程都将在同一个 CPU 上运行(很可能他们不会 - 这是一部分实际上具有并发子进程的点)。