CELERYD_CONCURRENCY, - 并发和自动缩放

时间:2017-07-04 10:18:34

标签: python django multithreading concurrency celery

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

我有一台专用服务器来运行芹菜任务,所以我可以使用所有CPU在这台服务器上运行芹菜工作者。

我有很多不同的python任务,我使用它们:CELERY_ROUTES,因为任务执行的是不同类型的python代码,我创建了5个不同的worker。 当我使用ansible部署项目时创建了这些worker,这是一个例子:

[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_DEFAULT_QUEUE = 'default_queue'

如果碰巧我没有路由任务,那么它将转到我的' default_queue'

为了给我的所有队列留出空间,我为default_queue设置了--concurrency为1,为我最重要的队列设置了更多。

但是我想知道,AutoScale对并发性的影响是否相同?意思是,如果我将并发设置为1并将--autoscale设置为15,10(上面的示例)

我的工人是否会工作'在CPU上并在此CPU上处理最多15个任务? 或者这是否意味着完全不同的东西?

1 个答案:

答案 0 :(得分:3)

同时设置concurrencyautoscale是没有意义的,因为两者都是控制给定工作者实例as explained here的工作程序子进程数的方法。

--concurrency N表示您的工作者实例将具有N个工作者子进程(意味着工作者实例可以处理N个concicure任务)。

--autoscale max, min表示对于给定的工作程序实例,您将至少具有min和最多max个并发工作程序子进程。

每个进程(主工作进程或其子进程中的任何子进程)将运行在哪个CPU上是不可预测的,它是操作系统的东西,但不要假设子进程都将在同一个进程上运行CPU(很有可能他们赢了 - 这实际上是并发子进程的一部分)。