2011-01-10 11 views
14

Kereviz yükledim (en son sürüm.) /home/myuser/fable/jobs adında bir dizim var. Bu dizin içinde, ben bir tasks.py denilen dosya var: Bu dizinde İçindeCelery neden Python kabuğunda çalışıyor, ancak Django görünümlerimde değil? (içe aktarma sorunu)

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

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

, ben de denilen celeryconfig.py bir dosya var: Benim /etc/profile yılında

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

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

, ben bu kadar ayarlamış benim PYTHONPATH:

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

Bu yüzden ben Kereviz işçiyi konsolu ($ celeryd --loglevel=INFO) kullanarak çalıştırıyorum ve deniyorum. Python konsolunu açıp görevleri içe aktarıyorum. Sonra göndericiyi çalıştırıyorum. Benim konsolunda görebileceğiniz gibi

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

Her şey yukarıdaki gibi kod tam 3 satırları benim Django'nın views.py gidip çalıştırdığınızda

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

Ama bu olsun, çalışır:

[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." 

Bu garip, çünkü celeryd istemcisi, başlattığımda, kayıtlı olduğunu gösteriyor.

[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 

Birisi yardımcı olabilir mi?

+0

Ayrıca django-kereviz mi yoksa sadece kereviz mi kullanıyorsunuz? –

cevap

10

import.py dosyasının içe aktarılabilmesi için bir django uygulamasında (settings.py'ye kayıtlı) olması gerektiğine inanıyorum. Alternatif olarak, görevleri ana projenizde veya uygulamalardan birinde __init__.py dosyasından içe aktarmayı deneyebilirsiniz. (Ne kullanın -E ve -B veya gerekli olabilir veya olmayabilir, ama bu)

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

:

Ayrıca manage.py gelen celeryd başlatmayı deneyin. dokümanlarında

+0

"Django uygulamasında olması gereken" derken ne demek istiyorsun? Ayrı bir dosya olarak tasks.py dosyası var ve bunları benim view.py (import fable.jobs.tasks) olarak içe aktarıyorum. – TIMEX

+0

Kereviz tarafından görülmesi için görevlerin kaydedilmesi gerekiyor. Bu dosya, otomatik olarak python tarafından yüklenmediğinden, "views.py" dosyasında otomatik olarak gerçekleşmez. Celery'ın bir django uygulamasında bulunan 'tasks.py' adlı bir dosyadaki görevleri otomatik olarak bulacağından emin olabilirsiniz veya görevleri bir __init __. Py'de içe aktarmayı deneyebilirsiniz. – Seth

+0

Python kabuğunu (her yerde) çalıştırdığım zaman, görevleri algılayabilir ve kaydedebilir miyim? – TIMEX

5

Bkz Otomatik adlandırma ve Bağıl İthalat: (celeryd çıktıda listelendiği gibi)

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

görevler adı "tasks.Submitter" dir, ancak "olarak görev almak fable.jobs.tasks.Submitter "

Buradaki en iyi çözüm, çalışanın" fable.jobs.tasks.Submitter ", gibi bir uygulama perspektifinden daha mantıklı olduğunu düşünüyor.

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

Bu Sonunda Ayarlar bölümünde

çalıştığı bunu yaptı.piton manage.py ı ran başka kabukta -l bilgi

celeryd: py Ben myapp klasörü altında

CELERY_IMPORTS = ("myapp.jobs",) 

eklendi ben jobs.py

from celery.decorators import task 

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

Sonra komut ile koştu adlı bir dosya oluşturuldu piton manage.py kabuk, sonra

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

ve ben alıyorum:

Önemli bir nokta, yeni bir işlev eklediğinizde her iki komut mermisini yeniden çalıştırmanız gerektiğidir. Adı hem istemciye hem de sunucuya kaydetmelisiniz.

:-)

+0

içerdiği dizinde çalıştı. Bu çözüm için teşekkürler, çok basit, ama projemdeki şovu durdurdu. Eğitime CELERY_IMPORTS satırını eklemelidirler. – sequoia

+0

Çözümünüzü gönderdiğiniz için teşekkür ederiz. Ben açıkça CELERY_IMPORTS django-kereviz ile gerekli olmadığını söylendi, bu djcelery.setup_loader() #celery bir katkıda bulunan tarafından ele. Hayal kırıklığı yaratan vahşi bir kazımı kovalamak zorunda kaldım. – mattdeboard

+1

-1 Belgeler, açıkça "myapp.jobs" olarak içe aktarılmamasını söylüyor. Bu örnekte ismi belirttiğinizi biliyorum, ancak bu örnek doğru yolu yapmaktan çok daha karmaşıktır. http://docs.celeryq.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports – citadelgrad