2011-07-28 17 views
11

UDATE3: Znalazłem problem. Zobacz odpowiedź poniżej.Samouczek Django Seler nie zwraca wyników

Update2: Wydaje mi może do czynienia z automatycznego nazywania i względną importu problemu uruchamiając samouczek djcelery przez manage.py shell, patrz poniżej. Nadal nie działa dla mnie, ale teraz otrzymuję nowe komunikaty o błędach dziennika. Zobacz poniżej.

AKTUALIZACJA: Dodałem dziennik u dołu postu. Wydaje się, że przykładowe zadanie nie jest zarejestrowane?

Original post:

Próbuję uzyskać Django seler uruchomiony. Nie mogłem przejść przez przykład.

zainstalowałem RabbitMQ i pomyślnie przeszedł samouczków bez kłopotów: http://www.rabbitmq.com/getstarted.html

Potem próbował przejść przez samouczek djcelery.

Kiedy biegnę python manage.py celeryd -l info dostaję komunikat: [Zadania] - app.module.add [2011-07-27 21:17:19, 990: OSTRZEŻENIE/MainProcess] seler @ Sequoia rozpoczęła.

To wygląda dobrze. Ja to na szczycie moich ustawieniach pliku:

import djcelery 
djcelery.setup_loader() 

BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "guest" 
BROKER_PASSWORD = "guest" 
BROKER_VHOST = "/" 

dodaje je do moich zainstalowanych aplikacji:

'djcelery', 

tutaj jest mój plik tasks.py w folderze Zadania mojego app:

from celery.task import task 

@task() 
def add(x, y): 
    return x + y 

dodałem to do mojego pliku django.wsgi:

os.environ["CELERY_LOADER"] = "django" 

Potem wszedłem to w wierszu poleceń:

>>> from app.module.tasks import add 
>>> result = add.delay(4,4) 
>>> result 
(AsyncResult: 7auathu945gry48- a bunch of stuff) 
>>> result.ready() 
False 

Więc wygląda na to działało, ale tutaj jest problem:

>>> result.result 
>>>    (nothing is returned) 
>>> result.get() 

Kiedy kładę w result.get() to po prostu wisi. Co ja robię źle?

UPDATE: To właśnie uruchomiony rejestrator w planie mówi, kiedy uruchomić serwer pracownika:

No handlers could be found for logger “multiprocessing” 

[Configuration] 
- broker:  amqplib://[email protected]:5672/ 
- loader:  djcelery.loaders.DjangoLoader 
- logfile:  [stderr]@INFO 
- concurrency: 4 
- events:  OFF 
- beat:  OFF 

[Queues] 
- celery:  exchange: celery (direct) binding: celery 

[Tasks] 
- app.module.add 
[2011-07-27 21:17:19, 990: WARNING/MainProcess] [email protected] has started. 

C:\Python27\lib\site-packages\django-celery-2.2.4-py2.7.egg\djcelery\loaders.py:80: UserWarning: Using settings.DEBUG leads to a memory leak, neveruse this setting in production environments! 
    warnings.warn(“Using settings.DEBUG leads to a memory leak, never” 

wtedy kiedy mogę umieścić w poleceniu: Komunikat ten

>>> result = add(4,4) 

w dzienniku błędów:

[2011-07-28 11:00:39, 352: ERROR/MainProcess] Unknown task ignored: Task of kind ‘task.add’ is not registered, please make sure it’s imported. Body->”{‘retries’: 0, ‘task’: ‘tasks.add’, ‘args’: (4,4), ‘expires’: None, ‘ta’: None 
    ‘kwargs’: {}, ‘id’: ‘225ec0ad-195e-438b-8905-ce28e7b6ad9’}” 
Traceback (most recent call last): 
    File “C:\Python27\..\celery\worker\consumer.py”,line 368, in receive_message 
     Eventer=self.event_dispatcher) 
    File “C:\Python27\..\celery\worker\job.py”,line 306, in from_message 
     **kw) 
    File “C:\Python27\..\celery\worker\job.py”,line 275, in __init__ 
     self.task = tasks[self.task_name] 
    File “C:\Python27\...\celery\registry.py”, line 59, in __getitem__ 
     Raise self.NotRegistered(key) 
NotRegistered: ‘tasks.add’ 

Jak uzyskać czy zadanie jest odpowiednio zarejestrowane i obsługiwane? dzięki.

UPDATE 2:

Ten link zasugerował, że nie zarejestrował błąd może być spowodowane niedopasowaniem nazwa zadania między klientem a pracownikiem - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

wyszli manage.py shell i wszedł powłokę Pythona wprowadzono:

>>> from app.module.tasks import add 
>>> result = add.delay(4,4) 
>>> result.ready() 
False 
>>> result.result 
>>>     (nothing returned) 
>>> result.get() 
        (it just hangs there) 

, więc otrzymuję to samo zachowanie, ale nowy komunikat dziennika. Z dziennika, wydaje się, że serwer działa, ale to nie będzie karmić wynik z powrotem:

[2011-07-28 11:39:21, 706: INFO/MainProcess] Got task from broker: app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] 
[2011-07-28 11:39:21, 706: INFO/MainProcess] Task app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] succeed in 0.04600000038147s: 8 

więc serwer dostał zadanie, a ona obliczana poprawną odpowiedź, ale nie wyśle ​​go z powrotem? Dlaczego nie?

+0

Czy używasz systemu Windows? Były doniesienia o wynikach, które nie działają w Windows dla Celery 3 – asksol

+0

Tak Używam okien. Mam zamiar powrócić do projektu, który wykorzystuje królik i seler. Będę więc pamiętał o twoich komentarzach. Generalnie byłem bardzo zadowolony z tych dwóch. – sequoia

Odpowiedz

14

znalazłem rozwiązania mojego problemu z innej stackoverflow postu: Why does Celery work in Python shell, but not in my Django views? (import problem)

musiałem dodać te linie do mojego pliku ustawień:

CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("app.module.tasks",) 

następnie w pliku task.py nazwałem zadanie jako takie:

@task(name="module.tasks.add") 

Serwer i klient musieli zostać poinformowani o nazwach zadań. Samouczki selera i django-selera pomijają te linie w swoich samouczkach.

+1

Nie mogę uwierzyć, że pominęli te kluczowe kluczowe linie w dokumentach Django Selera ..... – Tony

+2

@ Tony zobacz notatkę o Względnym Importie poniżej: http://docs.celeryproject.org/en/latest/django/first- steps-with-django.html # definiowanie-wywoływania-zadań Nie ma problemu, jeśli nie używasz względnego importu, a względny import jest odradzany w Pythonie – asksol

+0

Miałem podobny problem i czy względny import ma coś z tym wspólnego , bit CELERY_RESULT_BACKEND = "amqp" jest konieczny. – CrazyCasta

4

jeśli uruchomić seler w trybie debugowania jest łatwiej zrozumieć problem

python manage.py celeryd 

Co mówi dzienniki seler, seler odbiera zadanie? Jeśli nie prawdopodobnie istnieje problem z brokerem (? Źle kolejki)

dać nam więcej szczegółów, w ten sposób możemy pomóc

+0

gdzie jest przechowywany plik dziennika? Nie mogę tego znaleźć. Czy to byłaby log królika? lub inny? Dodałem tekst z uruchamiania rejestratora na pierwszym planie do mojego postu powyżej. Dzięki. – sequoia

Powiązane problemy