2012-10-02 13 views
19

Tôi cần gỡ lỗi nhiệm vụ Celery khỏi trình gỡ lỗi Eclipse. Tôi đang sử dụng Eclipse, PyDev và Django.Cách gỡ lỗi các nhiệm vụ Celery/Django chạy cục bộ trong Eclipse

Trước tiên, tôi mở dự án của mình trong Eclipse và đặt điểm ngắt ở đầu chức năng nhiệm vụ. Sau đó, tôi bắt đầu công nhân Celery từ Eclipse bằng cách nhấp chuột phải vào manage.py từ trình thám hiểm gói PyDev và chọn "Debug As-> Python Run" và chỉ định "celeryd -l info" làm đối số. Điều này bắt đầu MainThread, Mediator và ba luồng khác có thể nhìn thấy được từ trình gỡ lỗi Eclipse.

Sau đó tôi trở về quan điểm PyDev và khởi động ứng dụng chính bằng cách Right Click vào dự án và chọn Run As/PyDev: Django

vấn đề của tôi là một lần nhiệm vụ được đệ trình bởi mytask.delay() nó không dừng lại trên điểm ngắt. Tôi đặt một số dấu vết với mã nhiệm vụ để tôi có thể thấy rằng nó đã được thực hiện trong một trong các chủ đề công nhân.

Vì vậy, làm thế nào để làm cho trình gỡ rối Eclipse dừng lại trên điểm ngắt được đặt cùng với tác vụ khi nó được thực hiện trong chuỗi công nhân Celery?

Trả lời

28

Bạn nên xem xét tùy chọn chạy tác vụ cần tây trong cùng một luồng với quy trình chính (thông thường nó chạy trên một quy trình riêng), điều này sẽ làm cho gỡ lỗi dễ dàng hơn nhiều.

Bạn có thể nói với cần tây để chạy các nhiệm vụ đồng bộ bằng cách thêm cài đặt này để mô-đun settings.py của bạn:

CELERY_ALWAYS_EAGER = True 

Lưu ý: đây chỉ có nghĩa là để được sử dụng để gỡ lỗi hoặc phát triển giai đoạn!

+0

Cảm ơn, điều này giải quyết một phần vấn đề. Nhưng nếu tôi cần phải gỡ lỗi các nhiệm vụ khi chúng đang chạy song song trong các chủ đề khác nhau thì sao? – spoonboy

+3

còn pdb thì sao? xem tại đây http://docs.celeryproject.org/en/latest/tutorials/debugging.html –

+0

Bạn thấy đấy, tôi không thực sự cần gỡ lỗi nó từ xa. Tôi chỉ muốn gỡ lỗi cục bộ trong Eclipse trong chuỗi khác. – spoonboy

-1

Nếu nó chỉ chạy trên một chuỗi khác, nó sẽ hoạt động trên các phiên bản PyDev mới nhất (tôi nghĩ có một vấn đề trước khi một luồng sinh ra không được sửa lỗi, nhưng điều này đã được sửa).

Bây giờ, nếu nó khởi chạy trên một quy trình khác, bạn cần phải sử dụng trình gỡ rối từ xa (ngay cả khi nó nằm trên cùng một máy). Xem: http://pydev.org/manual_adv_remote_debugger.html

+0

Dường như chính xác như mô tả ở trên trong 2.7.3, thật không may. –

5

CELERYD_POOL mặc định là celery.concurrency.prefork:TaskPool sẽ sinh ra các quy trình riêng biệt cho mỗi công nhân và PyDev không thể nhìn thấy bên trong chúng. Nếu bạn thay đổi nó thành một trong các tùy chọn luồng thì bạn có thể sử dụng trình gỡ rối.

Ví dụ, đối Cần tây 3.1 bạn có thể sử dụng cài đặt này:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool' 

Lưu ý rằng điều này đòi hỏi các module threadpool được cài đặt.

Đồng thời đảm bảo có CELERY_ALWAYS_EAGER = False, nếu không, việc thay đổi lớp của hồ bơi sẽ không có ý nghĩa.

+0

wow điều này có vẻ khá tuyệt vời! –

0

tôi tạo ra một lệnh quản lý với nhiệm vụ kiểm tra .. thấy nó dễ dàng hơn so với chạy nó từ vỏ ..

10

Bạn có thể làm điều đó bằng cần tây của rdb:

from celery.contrib import rdb 
rdb.set_trace() 

Sau đó, trong một loại thiết bị đầu cuối khác nhau telnet localhost 6900 và bạn sẽ nhận được lời nhắc gỡ lỗi.

+2

hoặc cổng 6901 - theo dõi thông điệp trong thuật ngữ cần tây –