Podążam za tutorialem i zadania, które widzę w przykładzie (add, mul
) działają doskonale. Dostaję poprawną odpowiedź, gdy wykonuję res = add.delay(1,2); res.get()
.Niektóre zadania Selera działają, inne są niezarejestrowane.
Ale otrzymuję *** NotRegistered: u'pipeline.tasks.sayhello'
kiedy próbuję wykonać inne moje zadanie res = sayhello.delay('trex')
.
Jeśli wykonam res = sayhello('trex')
, mogę uzyskać wynik po prostu wpisując res
. Ale w ten sposób wykonuję funkcję ornidarly, bez używania Selera.
Zadaniem działa tylko wtedy, gdy go uruchomić w Django shell./manage shell
>>> res = sayhello.delay('trex')
>>> res.get()
u'Hello trex'
Tak, problem jest, że nie można wykonać sayhello
zadanie z pipeline/views.py
. Ale mogę wykonywać tam zadania add
i mul
.
Dlaczego tak jest? Jak poprawnie wykonywać zadania od views.py
?
Błąd pełny komunikat:
[2016-11-11 10:56:09,870: ERROR/MainProcess] Received unregistered task of type u'pipeline.tasks.sayhello'.
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:
'[["tiger"], {}, {"chord": null, "callbacks": null, "errbacks": null, "chain": null}]' (84b)
Traceback (most recent call last):
File "/home/trex/Development/Sirius/new/rocket/rocket-venv/local/lib/python2.7/site-packages/celery/worker/consumer/consumer.py", line 549, in on_task_received
strategy = strategies[type_]
KeyError: u'pipeline.tasks.sayhello'
wersja Django
1.9.7
wersja Seler:
celery==4.0.0
django-celery==3.1.17
Django projekt reż drzewo:
rocket
├── etl
│ ├── etl
│ │ ├── celery.py
│ │ ├── __init__.py
│ │ ├── settings
│ │ │ ├── base.py
│ │ │ ├── dev.py
│ │ │ ├── __init__.py
│ │ │ ├── production.py
│ │ │ └── test.py
│ │ ├── urls.py
│ │ ├── wsgi.py
│ ├── manage.py
│ ├── pipeline
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── tasks.py
│ │ ├── tests.py
│ │ ├── urls.py
│ │ ├── views.py
ETL/rurociąg/views.py
from .tasks import *
def get_response(request):
result = add.delay(1, 2)
result.get()
result = sayhello.delay('tiger')
result.get()
ETL/rurociąg/tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def sayhello(name):
return "Hello %s" % name
Również próbowałem to :
from celery.decorators import task
@task(name="sayhello")
def sayhello(name):
return "Hello {0}".format(name)
ETL/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'etl.settings.base')
app = Celery('etl')
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))
ETL/__ init__py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
ETL/Ustawienia/base.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_IMPORTS = ('pipeline.tasks',)
Tak, to przecinek. – trex
Ale czekaj, dlaczego działa to w przypadku innych zadań? Nie rozumiem. – trex
Przestał działać bez przecinka na końcu. Zadanie 'add' działa tylko z przecinkiem. Zadanie 'sayhello' nadal nie działa. Nie rozumiem, zadziałało, przestało działać. – trex