сельдерей рабочий импортирует задачи только тогда, когда они не отсоединены

#django #rabbitmq #celery #django-celery

#django #rabbitmq #сельдерей #django-celery

Вопрос:

Я пытаюсь заставить мое приложение django отправлять задачи рабочему из сельдерея, и это удается, когда рабочий запускается подключенным. Как только я добавляю —detach, задачи не регистрируются.

 [2020-10-26 04:09:33,159: ERROR/MainProcess] Received unregistered task of type 'devapp.tasks.create_random_files'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you're using relative imports?

Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.

The full contents of the message body was:
'[[20, "blah", 5120], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (93b)
Traceback (most recent call last):
  File "/pysite/project/venv/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 562, in on_task_received
    strategy = strategies[type_]
KeyError: 'devapp.tasks.create_random_files'
  

В моем tasks.py У меня есть

 import os
import string
import subprocess
from celery import shared_task, task

@shared_task(name='devapp.tasks.create_random_files')
def create_random_files(total,filename,size):
    for i in range(int(total)):
        filenum = str(i).zfill(5)
        rnd_filename = '/brdis/{}-{}'.format(filenum,filename)
        with open(rnd_filename, 'wb') as f:
            f.write(os.urandom(size))
            f.close
    return '{} random files created'.format(total)

  

и в моем views.py У меня есть

 from django.shortcuts import render
from django.http import HttpResponse

from django.contrib import messages
from django.views.generic import TemplateView
from django.views.generic.list import ListView
from django.views.generic.edit import FormView
from django.shortcuts import redirect

from .forms import CreateRandomFilesForm, GetFileListForm, ClamScanFileForm
from .tasks import create_random_files, clamscanfile

class ClamScanFileView(FormView):
    template_name = 'devapp/clamscan_file.html'
    form_class = ClamScanFileForm

    def form_valid(self, form):
        filename = form.cleaned_data.get('filename')
        clamscanfile.delay(filename)
        messages.success(self.request, 'We are scanning your file!s Wait a moment and refresh this page.')
        return redirect('files_list')

  

Я понимаю, что это может быть относительный импорт (что-то еще, что мне нужно, чтобы разобраться), но я не понимаю, почему добавление —detach в команду celery worker приводит к этой ошибке:

celery -A project worker -E --loglevel=INFO --logfile=/var/log/celery/celeryd.log --pidfile=/var/run/celery/celeryd.pid

работает нормально, но…

celery -A project worker -E --loglevel=INFO --logfile=/var/log/celery/celeryd.log --pidfile=/var/run/celery/celeryd.pid --detach

запускает worker, но не регистрирует задачи?

Любая помощь приветствуется.

FWIW

 celery report

software -> celery:4.4.7 (cliffs) kombu:4.6.11 py:3.6.8
            billiard:3.6.3.0 py-amqp:2.6.1
platform -> system:Linux arch:64bit, ELF
            kernel version:3.10.0-1127.19.1.el7.x86_64 imp:CPython
loader   -> celery.loaders.default.Loader
settings -> transport:amqp results:disabled

  

Комментарии:

1. Вы добились чего-нибудь с этим? Возникает та же проблема с —detach или multi

2. worker будет отвечать на команды «inspect», что означает, что он подключен к тому же бэкэнду, поэтому он получает правильную конфигурацию…

3. Попытался установить пакет приложения глобально, но все то же поведение. сейчас идей нет.

Ответ №1:

Это ошибка с 4.4.7. Понижение версии до 4.4.6 или обновление до 5 должны исправить это.

https://github.com/celery/celery/issues/6370

Комментарии:

1. Спасибо @Giannis, это имеет смысл. Это сработало для вас?

2. Я обновился до 5.0.2, но протестирован с 4.4.6, и он также работает.

3. Прошу прощения за задержку (очень) ответа. Некоторое время отсутствовал в этом проекте. Все еще не удается обновить в данный момент из-за конфликтов с django-celery-results и flower. Возможно, мне придется отказаться от flower…