2010-07-28 33 views
6

Không nói về phương pháp delay.Làm cách nào để trì hoãn một tác vụ bằng Celery?

Tôi muốn có thể thực hiện tác vụ, với nhiệm vụ là task_id và thay đổi ETA khi đang di chuyển, trước khi nó được thực thi.

Hiện tại tôi phải hủy và lập lại lịch biểu. Troublesome nếu quá trình theo lịch trình liên quan đến rất nhiều thứ.

+0

Vì vậy, đã bạn quản lý để làm điều đó cuối cùng? – julkiewicz

+0

Bạn có thể trì hoãn bất kỳ tác vụ nào bằng * cần tây *, miễn là bạn xác định tác vụ là "hấp thụ calo". ;-) http://wiki.answers.com/Q/Is_it_true_that_celery_has_negative_calories – Sam

+0

@Sam lold, thx. – julkiewicz

Trả lời

1

Bạn nên lưu trữ một số giá trị 'tạm dừng' bên ngoài hàng cần trục/nhiệm vụ. Tôi làm điều này với một bưu phẩm bằng cách sử dụng cần tây. Tôi có thể tạm dừng các phần của hệ thống bằng cách thiết lập các giá trị trong cả memcache lẫn mysql. Các nhiệm vụ sau đó đảm bảo truy vấn tài nguyên bên ngoài trước khi thực hiện tác vụ. Nếu nó có nghĩa là để được tạm dừng nó đặt nó hiện một task.retry() mà làm cho nó đi qua thời gian chậm trễ thử lại và như vậy.

+0

Các prupose nó để loại bỏ các nhiệm vụ từ hàng đợi. Nếu nó chỉ là những gì bạn đề nghị, các contrib AbortableTask đã làm điều đó. –

1

Giả sử bạn đang sử dụng django-cần tây và PeriodicTask với DatabaseScheduler, bạn cần phải sửa đổi khoảng PeriodicTask hoặc crontab của bạn và lưu nó. Nếu tác vụ của bạn được xác định bằng một khoảng thời gian, hãy sửa đổi thuộc tính last_run_at.

Bạn chạy celerybeat với lịch trình cơ sở dữ liệu với:

python manage.py celerybeat -S djcelery.schedulers.DatabaseScheduler 
+1

Vấn đề là các khoảng thời gian là không đơn điệu, vì vậy rất tiếc là tôi không sử dụng PeriodicTask. Tôi cần phải làm chính xác những gì đã được chỉ định trong câu hỏi. – julkiewicz

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