2011-01-10 13 views
14

Zainstalowałem system Celery (najnowsza stabilna wersja). Mam katalog o nazwie /home/myuser/fable/jobs. Wewnątrz tego katalogu, mam plik o nazwie tasks.py:Dlaczego Seler działa w powłoce Pythona, ale nie w moich widokach Django? (problem z importowaniem)

from celery.decorators import task 
from celery.task import Task 

class Submitter(Task): 
    def run(self, post, **kwargs): 
     return "Yes, it works!!!!!!" 

Wewnątrz tego katalogu, mam również plik o nazwie celeryconfig.py:

BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "abc" 
BROKER_PASSWORD = "xyz" 
BROKER_VHOST = "fablemq" 

CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("tasks",) 

W moim /etc/profile, mam je ustawić jako moje PYTHONPATH:

  • PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs

Więc uruchamiam mojego pracownika Selera przy użyciu konsoli ($ celeryd --loglevel=INFO) i wypróbowuję go. Otwieram konsolę Python i importuję zadania. Następnie uruchamiam Zgłaszającego.

>>> import fable.jobs.tasks as tasks 
>>> s = tasks.Submitter() 
>>> s.delay("abc") 
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987> 

Wszystko działa, jak widać w moim konsoli

[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s: 

Ale kiedy idę do mojego views.py Django i uruchomić dokładnych 3 linie kodu jak wyżej, mam to:

[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'} 
Traceback (most recent call last): 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message 
    eventer=self.event_dispatcher) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message 
    eta=eta, expires=expires) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__ 
    self.task = tasks[self.task_name] 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__ 
    raise self.NotRegistered(str(exc)) 
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported." 

To dziwne, ponieważ klient selerowy pokazuje, że jest zarejestrowany, kiedy go uruchomię.

[2011-01-09 17:38:27,446: WARNING/MainProcess] 
Configuration -> 
    . broker -> amqp://[email protected]:5672/fablemq 
    . queues -> 
     . celery -> exchange:celery (direct) binding:celery 
    . concurrency -> 1 
    . loader -> celery.loaders.default.Loader 
    . logfile -> [stderr]@INFO 
    . events -> OFF 
    . beat -> OFF 
    . tasks -> 
     . tasks.Decayer 
     . tasks.Submitter 

Czy ktoś może pomóc?

+0

Czy sam używasz django-selera lub po prostu selera? –

Odpowiedz

10

Wierzę, że plik tasks.py musi znajdować się w aplikacji django (zarejestrowanej w pliku settings.py) w celu zaimportowania. Możesz również spróbować zaimportować zadania z pliku __init__.py w swoim głównym projekcie lub jednej z aplikacji.

Sponsorowane począwszy celeryd z manage.py:

$ python manage.py celeryd -E -B -lDEBUG 

(-E i -B mogą lub nie mogą być konieczne, ale to co używam).

+0

Co to znaczy "musi być w aplikacji django"? Mam tasks.py jako osobny plik i importuję go do moich views.py (import fable.jobs.tasks jako zadania) – TIMEX

+0

Zadania muszą zostać zarejestrowane, aby mogły być widoczne przez selera. To nie stanie się automatycznie w pliku 'views.py', ponieważ ten plik nie jest automatycznie ładowany przez Pythona. Jestem pewien, że Seler automatycznie znajdzie zadania w pliku o nazwie 'tasks.py', który znajduje się w aplikacji django, lub możesz spróbować zaimportować zadania w' __init __. Py'. – Seth

+0

Jak to się dzieje, że po uruchomieniu powłoki Pythona (w dowolnym miejscu) może wykryć i zarejestrować zadania? – TIMEX

5

See automatycznego nazywania i względne przywozu, w docs:

http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

Nazwa zadania jest "tasks.Submitter" (wymienione w wyjściu celeryd), ale zaimportować zadanie jako " fable.jobs.tasks.Submitter "

Domyślam się, że najlepszym rozwiązaniem jest to, czy pracownik widzi także jako" fable.jobs.tasks.Submitter ", ma to więcej sensu z punktu widzenia aplikacji.

CELERY_IMPORTS = ("fable.jobs.tasks",) 
11

To, co zrobiłem, które ostatecznie pracował

w Ustawieniach.py dodałem

CELERY_IMPORTS = ("myapp.jobs",) 

w folderze myapp stworzyłem plik o nazwie jobs.py

from celery.decorators import task 

@task(name="jobs.add") 
def add(x, y): 
    return x * y 

Potem wybiegł z poleceń: python manage.py celeryd -l informacji

w innej powłoce Pobiegłem python manage.py shell, następnie

>>> from myapp.jobs import add 
>>> result = add.delay(4, 4) 
>>> result.result 

i uzyskać:

Ważne jest, aby ponownie uruchomić obie powłoki poleceń po dodaniu nowej funkcji. Musisz zarejestrować nazwę zarówno na kliencie, jak i na serwerze.

:-)

+0

Dzięki za to rozwiązanie, jest to tak proste, ale to zatrzymało pokaz na moim projekcie. Powinny one zawierać linię CELERY_IMPORTS w samouczku. – sequoia

+0

Dziękujemy za opublikowanie rozwiązania. Zostałem wyraźnie poinformowany, że CELERY_IMPORTS nie jest potrzebne w przypadku django-selera, że ​​djcelery.setup_loader() obsłużył to, przez autora w #celery. Rozczarowujące, że muszę niepotrzebnie ścigać dziką gęś. – mattdeboard

+1

-1 Dokumentacja wyraźnie nie importuje go jako "myapp.jobs". Wiem, że w tym przykładzie podajesz nazwę, ale ten przykład jest dużo bardziej mylący niż wykonanie we właściwy sposób. http://docs.celeryq.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports – citadelgrad

Powiązane problemy