Функция импорта сельдерея Django не работает - PullRequest
0 голосов
/ 03 ноября 2018

Я какое-то время пытался создать задачу, которая состоит в создании образца образца каждые 5 часов. Мне удалось настроить celery с помощью redis и выполнить задачу, которая приведена в качестве примера в документации, но когда я хочу сделать что-то более сложное, включающее в себя набор запросов, он не выполняет меня. Задача исчезает из списка при перезапуске очереди .

это структура проекта:

    proj:
  Muestras:
    -views.py
    -tasks.py
    -models.py
  Servicios:
    -models.py
  proj:
    -celery.py
    -settings.py

В settings.py:

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/London'
CELERY_BEAT_SCHEDULE = {
   'generar-muestras': {  # name of the scheduler
   'task': 'Muestras.tasks.crear_muestras_tarea',
   'schedule': 30.0,  # set the period of running
  },
}

Это представление, которое находится внутри Muestras.views

from .models import Muestra
from backend.Servicios.models import Servicio

#this works in console
def generar_muestras():
    services = Servicio.models.all()

    for i in services:
        muestra = Muestra(servicio_id=i.id)
        muestra.save

В Muestras.tasks.py

from __future__ import absolute_import, unicode_literals
from celery import task
from .views import generar_muestras


 @task
 def crear_muestras_task():
     print('hola esto tiene una funcion')

     #generar_muestras()

это то, что у меня есть в celery.py:

 from __future__ import absolute_import, unicode_literals
 import os

 from celery import Celery
 from django.conf import setting

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

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

 @app.task(bind=True)
 def debug_task(self):
     print('Request: {0!r}'.format(self.request))

и при выполнении

celery -A proj worker -l info -B

все работает хорошо и выполняет задачу, но когда я делаю эту строку в Muestras.tasks.py и импортирую из .views представление.

         generar_muestras()

задача исчезает из списка, и я получаю эту ошибку:

[2018-11-04 22:31:37,734: INFO/MainProcess] celery@linux-z6z3 ready.
[2018-11-04 22:31:37,876: ERROR/MainProcess] Received unregistered task of 
type 'Muestras.tasks.crear_muestras_tarea'.
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:
b'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": 
null}]' (77b)
Traceback (most recent call last):
File "/home/wecbxxx/PycharmProjects/porj/venv/lib64/python3.6/site- 
packages/celery/worker/consumer/consumer.py", line 558, in 
on_task_received
strategy = strategies[type_]
KeyError: 'Muestras.tasks.crear_muestras_tarea'

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Чтобы расширить ответ @ gokhan, необходимо убедиться в двух вещах:

  1. Украсьте свою задачу с помощью @app.task

from __future__ import absolute_import, unicode_literals
<b>from proj.celery import app</b> 
from .views import generar_muestras


<b>@app.task</b>
def crear_muestras_task():
    print('hola esto tiene una funcion')
    #generar_muestras()
  1. Убедитесь, что в 1011 * указано Muestras. Это позволит autodiscover обнаружить ваши задачи :

Далее, обычной практикой для приложений многократного использования является определение всех задач в отдельном модуле tasks.py, и у Celery есть способ автоматического обнаружения этих модулей:

app.autodiscover_tasks()

С помощью строки выше Celery будет автоматически обнаруживать задачи из всех установленных приложений в соответствии с соглашением tasks.py:

0 голосов
/ 03 ноября 2018

Вы не поделились своим settings.py или тем, как вы управляете сельдереем, так что я делаю дикое предположение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...