2016-11-11 35 views
8

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',) 

Odpowiedz

4

T jest to błąd, ponieważ ustawienie CELERY_IMPORTS nie działa poprawnie w pliku etl/settings/base.py. Więc moja propozycja jest taka:

Usuń przecinek z

CELERY_IMPORTS = ('pipeline.tasks' ,) 

A jeśli problem nie ustępuje, a następnie uruchomić polecenie:

celery -A pipeline.tasks worker --loglevel=DEBUG 

jeszcze jedno, twoje tasks.py potrzeb plików być w aplikacji Django (która jest zarejestrowana w usłudze settings.py) w celu jej zaimportowania. Sprawdź także ten punkt. Dzięki.

+0

Tak, to przecinek. – trex

+0

Ale czekaj, dlaczego działa to w przypadku innych zadań? Nie rozumiem. – trex

+0

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