2011-07-28 37 views
11

UDATE3: đã tìm thấy sự cố. Xem câu trả lời dưới đây.Hướng dẫn Django Celery không trả về kết quả

UPDATE2: Dường như tôi có thể đang xử lý vấn đề đặt tên và nhập tương đối tự động bằng cách chạy hướng dẫn djcelery thông qua vỏ manage.py, xem bên dưới. Nó vẫn không làm việc cho tôi, nhưng bây giờ tôi nhận được thông báo lỗi đăng nhập mới. Xem bên dưới.

CẬP NHẬT: Tôi đã thêm nhật ký ở cuối bài đăng. Có vẻ nhiệm vụ ví dụ không được đăng ký?

Original Post:

tôi đang cố gắng để có được django-cần tây lên và chạy. Tôi không thể vượt qua được ví dụ.

Tôi đã cài đặt thành công RabbitMQ và đã trải qua các hướng dẫn mà không gặp rắc rối: http://www.rabbitmq.com/getstarted.html

sau đó tôi đã cố gắng để đi qua các hướng dẫn djcelery.

Khi tôi chạy python manage.py celeryd -l info Tôi nhận được thông báo: [Nhiệm vụ] - app.module.add [2011-07-27 21:17:19, 990: CẢNH BÁO/MainProcess] cần tây @ Sequoia đã bắt đầu.

Điều đó có vẻ tốt. Tôi đặt này ở đầu xác lập cá nhân nộp:

import djcelery 
djcelery.setup_loader() 

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

thêm này để cài đặt ứng dụng của tôi:

'djcelery', 

đây là tập tin tasks.py của tôi trong thư mục nhiệm vụ ứng dụng của tôi:

from celery.task import task 

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

tôi thêm này để tập django.wsgi tôi:

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

Sau đó, tôi bước này tại cửa sổ dòng lệnh:

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

Vì vậy, nó có vẻ như nó đã làm việc, nhưng đây là vấn đề:

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

Khi tôi đặt trong result.get() nó chỉ bị treo. Tôi đang làm gì sai?

UPDATE: Đây là những gì chạy logger ở mặt trước nói khi tôi khởi động máy chủ nhân:

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” 

sau đó khi tôi đặt trong lệnh:

>>> result = add(4,4) 

này xuất hiện trong nhật ký lỗi:

[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’ 

Làm cách nào để nhận nhiệm vụ được đăng ký và xử lý đúng cách là gì? cảm ơn.

UPDATE 2:

Liên kết này cho rằng lỗi không đăng ký có thể là do tên không khớp nhiệm vụ giữa khách hàng và người lao động - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

thoát vỏ manage.py và bước vào một vỏ python và đã nhập như sau:

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

vì vậy tôi nhận được cùng một hành vi, nhưng thông điệp tường trình mới. Từ nhật ký, nó xuất hiện máy chủ đang làm việc nhưng nó sẽ không ăn kết quả lại ra:

[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 

Vì vậy, các máy chủ có nhiệm vụ và nó tính câu trả lời chính xác, nhưng nó sẽ không gửi nó trở lại? tại sao không?

+0

Bạn đang sử dụng Windows? Đã có báo cáo về kết quả không hoạt động trong Windows cho Celery 3 – asksol

+0

Có Tôi đang sử dụng các cửa sổ. Tôi sắp xem lại dự án sử dụng thỏ và cần tây. Tôi sẽ giữ cho ý kiến ​​của bạn trong tâm trí sau đó. Nói chung tôi đã rất hạnh phúc với cả hai mặc dù. – sequoia

Trả lời

14

tôi tìm thấy giải pháp cho vấn đề của tôi từ một stackoverflow bài: Why does Celery work in Python shell, but not in my Django views? (import problem)

tôi đã có thêm những dòng này để cài đặt tập tin của tôi:

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

sau đó trong file task.py tôi đặt tên cho nhiệm vụ như vậy:

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

Máy chủ và ứng dụng khách phải được thông báo về tên tác vụ. Các hướng dẫn cần tây và django-cần tây bỏ qua những dòng này trong hướng dẫn của họ.

+1

Tôi không thể tin rằng họ bỏ qua những dòng quan trọng quan trọng trong tài liệu cần tây django ..... – Tony

+2

@Tony xem ghi chú về Nhập khẩu tương đối bên dưới tại http://docs.celeryproject.org/en/latest/django/first- step-with-django.html # define-and-calling-tasks Nó không phải là một vấn đề trừ khi bạn sử dụng nhập khẩu tương đối, và nhập khẩu tương đối được khuyến khích trong Python – asksol

+0

Tôi đã có một vấn đề tương tự và nhập khẩu tương đối có liên quan đến nó hay không , CELERY_RESULT_BACKEND = 'amqp' bit là cần thiết. – CrazyCasta

4

nếu bạn chạy cần tây trong chế độ gỡ lỗi được dễ dàng hơn hiểu được những vấn đề

python manage.py celeryd 

gì cần tây bản ghi cho biết, cần tây đang nhận nhiệm vụ? Nếu không thể có một vấn đề với nhà môi giới (? Sai hàng đợi)

Hãy cho chúng tôi biết thêm chi tiết, theo cách này, chúng tôi có thể giúp bạn

+0

nơi tệp nhật ký được lưu trữ ở đâu? Tôi không thể tìm thấy nó. Nó sẽ là nhật ký thỏmq? hay cách khác? Tôi đã thêm văn bản từ chạy trình ghi nhật ký vào mặt đất tới bài đăng của tôi ở trên. Cảm ơn. – sequoia

Các vấn đề liên quan