gpt4 book ai didi

django - Celery 进程架构和妖魔化的正确方法

转载 作者:行者123 更新时间:2023-12-02 21:04:49 35 4
gpt4 key购买 nike

我有一个在 uwsgi/nginx 上运行的 Python/Django 项目。对于异步任务,我们使用rabbitmq/celeryd和supervisord来管理所有守护进程

版本:

  • Python:2.7
  • Django:1.9.7
  • celery :23.1.3
  • django-celery:3.1.17

Celery 有 10 个 Direct 类型的队列(例如队列1,队列2,...)每个队列都由一个单独的 celeryd 进程处理,该进程通过supervisord 进行管理。每个supervisord进程如下所示

[program:app_queue_worker]
command=/var/www/myproj/venv/bin/celery worker -A myproj -c 2 --queue=queue1 --loglevel=INFO
directory=/var/www/myproj/
user=ubuntu
numprocs=1
autostart=true
autorestart=true
startsecs=10
exitcodes=1
stopwaitsecs = 600
killasgroup=true
priority=1000

因此 Supervisord 正在运行 10 个主进程和 20 个工作进程

我注意到的另一件事是 uwsgi 还产生了一些并发=2 的 celery 工作人员(还不明白如何以及为什么)。因此,如果我有 4 个 uwsgi 进程正在运行,我将另外运行 10 个 celery 工作人员

所有这些worker每个人都占用200-300M内存?我感觉到这里有些不对劲,但我无法指出它。 Celery 不应该运行这样占用大量内存的进程吗?

注意: Debug=False,不会因为debug而导致内存泄漏

有人可以评论一下这个架构是正确还是错误吗?

运行 2-3 个 celery MainProcesses 来同时监听所有队列并增加其并发性会更好吗?

更新:celery.py 配置

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')

from django.conf import settings # noqa
from chatterbox import celery_settings

app = Celery('MyProject')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')

app.conf.update(
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
CELERYD_CONCURRENCY=1,
)

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

最佳答案

对此没有简单的答案。

对我来说,uwsgi 产生 celery worker 的事实是错误的。

仅创建消耗所有队列的工作进程可能会导致长时间运行的任务导致某些队列溢出的情况,而使用短期运行的任务消耗特定队列的单独工作进程可能会使情况变得更好。一切都取决于您的用例。

300MB的剩余内存已经不少了。如果任务是 I/O 绑定(bind),则使用多线程/gevent。但是,如果任务受 CPU 限制,则除了明智地扩展进程之外,您别无选择。

关于django - Celery 进程架构和妖魔化的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689596/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com