python - CELERYD_CONCURRENCY, --并发和自动缩放

标签 python django multithreading concurrency celery

我有一些关于任务路由、并发性和性能的问题。 这是我的用例:

我有一台专用服务器来运行 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/

相关文章:

python - 使用socket.recv()时,当没有更多字节可读取时,程序挂起

javascript - 假设我在 Django 中有这个循环......我该如何显示它?

multithreading - 多线程make

c++ - vtkUnstructuredGrid->GetPoint() 的线程安全只读替代方案

python - 将字符串值的字符连接到相同的列值

python - Django forms.FileField 验证

python - 从字典+列表生成所有可能的排列

python - Django:如何在佛罗里达设置中设置 EDT 时区

django - 在 Django 中,aggregate(Count()) 是否比 .count() 更快或更好?

java - 如果我不关闭 java 中的 BufferedReader 会发生什么? (多线程程序中的流式读取)