celery - задание не выполняется, несмотря на то, что оно зарегистрировано. Консоль сельдерея не отражает получение задания - PullRequest
0 голосов
/ 08 апреля 2020

После просмотра множества тем по одной и той же проблеме я не нашел ответа.

Я запускаю приложение Django со следующими вещами

Python: 3,6

Django: 3,0,5

Сельдерей: 4,0,2

Kombu: 4.2.0

Я запускаю весь стек с docker -композицией, сельдерей работает в другом контейнере. Очевидно, моя задача - зарегистрироваться в сельдерее, потому что, если я проверяю зарегистрированные задачи своего приложения, я получаю список с одним элементом, самой задачей:

$ celery -A apps.meals.tasks inspect registered
-> celery@7de3143ddcb2: OK
    * apps.meals.tasks.send_slack_notification

myproj/settings.py

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps',
    'apps.meals',
]

myproj/celery.py:

from __future__ import absolute_import, unicode_literals
from celery import Celery
import os
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')

app = Celery('myproj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

app.conf.update(
    BROKER_URL=settings.BROKER_URL,
)

Моя задача находится в другом месте, в приложении meals, в файле с именем tasks.py.

apps/meals/tasks.py

from django.conf import settings
from slackclient import SlackClient
from celery.utils.log import get_task_logger
from myproj import celery_app
from json import loads, dumps

logger = get_task_logger(__name__)


slack_markdown_text = "Hola!\n El menu de hoy es:\n {content}\n Pueden enviar su pedido aca: {link}\n Saludos!"


@celery_app.task(name="apps.meals.tasks.send_slack_notification")
def send_slack_notification(serial_menu, serial_options):
  ...

Моя файловая структура выглядит следующим образом:

technical-tests/
|
|--apps/
|----*snap
|----meals/
|------*snap
|------tasks.py
|--myproj
|----*snap
|----celery.py
|----settings.py

Наконец, docker -compose.yml выглядит так:

version: '3.5'

services:
   backend: ....
   celery:
       build: 
         context: ..
         dockerfile: ./deploy/Dockerfile
       volumes:
         - ../code/:/opt/somelocation
       environment:
         - SECRET_KEY
         - SLACK_TOKEN
         - SLACK_CHANNEL
         - SLACK_URL_PATTERN
         - BROKER_URL
       command: celery -A apps.meals.tasks worker -l info
       depends_on: 
         - backend
         - redis

Консоль Celery Work :

Консоль Celery при запуске НЕ показывает этот довольно цветной экран, когда появляются зарегистрированные задачи, так что это подозрительно. Он показывает только:

celery_1_aa9c50e916ae | /usr/local/lib/python3.6/site-packages/celery/platforms.py:796: RuntimeWarning: You're running the worker with superuser privileges: this is
celery_1_aa9c50e916ae | absolutely not recommended!
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae | Please specify a different user using the --uid option.
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae | User information: uid=0 euid=0 gid=0 egid=0
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae |   uid=uid, euid=euid, gid=gid, egid=egid,
celery_1_aa9c50e916ae | [2020-04-08 14:05:34,024: INFO/MainProcess] Connected to redis://redis:6379/0
celery_1_aa9c50e916ae | [2020-04-08 14:05:34,034: INFO/MainProcess] mingle: searching for neighbors
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,053: INFO/MainProcess] mingle: all alone
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,068: WARNING/MainProcess] /usr/local/lib/python3.6/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
celery_1_aa9c50e916ae |   warnings.warn('Using settings.DEBUG leads to a memory leak, never '
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,069: INFO/MainProcess] celery@7de3143ddcb2 ready.

Я знаю, что задача не выполняется, потому что в python shell, когда я вызываю send_slack_notifications без delay, она запускается сразу, но когда я использую delay команды зависают навсегда и консоль сельдерея не двигается, как будто она не получает никакой информации.

Любое понимание очень ценится!

ОБНОВЛЕНИЕ

Вызов delay осуществляется в apps/meals/views.py

from apps.meals.tasks import send_slack_notification

@login_required
def notify_menu(request, uuid):
    if is_staff(request.user):
        menu = Menu.objects.filter(uuid=uuid)
        send_slack_notification.delay(
            serialize(menu),
            serialize(menu.first().list_options())
        )

1 Ответ

0 голосов
/ 09 апреля 2020
  1. В вашей конфигурации сельдерея добавьте переменную среды C_FORCE_ROOT со значением 1.
  2. . Используйте CELERY_BROKER_URL в django настройках, чтобы правильно настроить брокера сельдерея из настроек и не передавайте BROKER_URL из среды (сельдерей будет сбит с толку, поскольку переменная среды может переопределить переменную настройки.
  3. Не устанавливайте BROKER_URL с помощью app.conf.update, используйте настройку CELERY_BROKER_URL как обсуждалось выше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...