Невозможно запустить фоновые задачи с Celery + Django + Gunicorn - PullRequest
0 голосов
/ 05 июля 2019

Stack:

Python v2.7
Django v1.11
Celery v4.3.0
Gunicorn v19.7.1
Nginx v1.10

Когда я пытаюсь запустить django server и celery вручную , асинхронные задачи выполняются, как и ожидалось.


Проблема возникает при развертывании проекта django с использованием Gunicorn плюс Nginx. Я попытался запустить Celery, используя supervisor, но это не помогло.


views.py

def _functionA():
    _functionB.delay() #where _functionB is registered async task.

settings.py

# Celery settings
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

celery_init.py

from __future__ import absolute_import
import os

from celery import Celery


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

app = Celery('myproject')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

__init__.py



# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from myproject.celery_init import app as celery_app

__all__ = ['celery_app']

gunicorn.service

[Unit]
Description=Gunicorn application server....
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=<myprojectdir>
Environment=PYTHONPATH=<ENV>
ExecStart=<myprojectdir>/env/bin/gunicorn --workers 3 --access-logfile access_gunicorn.log --error-logfile error_gunicorn.log --capture-output --log-level debug --bind unix:<myprojectdir>/myproject.sock <myproject>.wsgi:application

[Install]
WantedBy=multi-user.target

myproject_nginx.conf

server {
    listen 8001;
    location / {
        include proxy_params;
        proxy_pass http://unix:<myprojectdir>/myproject.sock;
    }
}

celery worker

celery worker -B -l info -A myproject -Q celery,queue1,queue2,queue3 -n beat.%h -c 1

Может ли кто-нибудь помочь мне с моим вопросом (ами) ниже:

Почему при развертывании Django с использованием Gunicorn и nginx работник Celery не выполняет задачи, тогда как при запуске вручную он может выполнять задачи, то есть при запуске с python manage.py runserver ....

1 Ответ

1 голос
/ 08 июля 2019

Уровень параллелизма равен 1 (-c 1 в командной строке вашего рабочего).Это в основном означает, что работник настроен для запуска ОДНОЙ ЗАДАЧИ в любой момент времени.Если ваши задачи выполняются долго, то у вас может сложиться впечатление, что Celery ничего не выполняет ...

Вы можете легко это проверить - запустив какое-то задание, запустите следующее:

celery -A myproject inspect active

В нем будет отображаться список запущенных задач (если есть).

Еще одна вещь, которую необходимо исправить, - это переменные конфигурации.Теперь Celery 4 ожидает, что все переменные конфигурации будут в нижнем регистре.Прочтите документ Что нового в Celery 4.0 (latentcall) для получения дополнительной информации, особенно в разделе Имена параметров в нижнем регистре .

...