2012-01-19 43 views
65

Tôi đã đọc tài liệu và tìm kiếm nhưng dường như không tìm thấy câu trả lời thẳng:Hủy tác vụ đã thực hiện với Celery?

Bạn có thể hủy tác vụ đã thực hiện không? (Như trong nhiệm vụ đã bắt đầu, mất một thời gian, và nửa chặng đường nó cần phải được hủy bỏ)

Tôi thấy điều này từ doc tại Celery FAQ

>>> result = add.apply_async(args=[2, 2], countdown=120) 
>>> result.revoke() 

Nhưng tôi không rõ ràng nếu điều này sẽ hủy xếp hàng đợi nhiệm vụ hoặc nếu nó sẽ giết chết một tiến trình đang chạy trên một nhân viên. Cảm ơn bất kỳ ánh sáng bạn có thể đổ!

Trả lời

116

thu hồi hủy thực thi tác vụ. Nếu một nhiệm vụ bị thu hồi, các công nhân bỏ qua nhiệm vụ và không thực hiện nhiệm vụ đó. Nếu bạn không sử dụng hồi sinh liên tục, nhiệm vụ của bạn có thể được thực hiện sau khi khởi động lại của nhân viên.

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

Thu hồi có một tùy chọn chấm dứt mà là False theo mặc định. Nếu bạn cần phải hủy tác vụ thi hành, bạn cần phải đặt chấm dứt thành Đúng.

>>> from celery.task.control import revoke 
>>> revoke(task_id, terminate=True) 

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

+0

Đây chính là lời giải thích mà tôi đang tìm kiếm, cảm ơn bạn! – dcoffey3296

+0

Tính năng này có hoạt động trong môi trường phân phối không? Tôi có nghĩa là nếu tôi có công nhân trên nhiều máy đang thực hiện nhiệm vụ. Cần tây có theo dõi máy nào nhiệm vụ đang thực thi không? – ksrini

+0

. Giao tiếp với công nhân diễn ra thông qua người môi giới. – mher

0

Xem các tùy chọn sau cho tác vụ: time_limit, soft_time_limit (hoặc bạn có thể đặt nó cho công nhân). Nếu bạn muốn kiểm soát không chỉ thời gian thực thi, thì hãy xem đối số expires của phương thức apply_async.

24

Trong cần tây 3.1, các API of revoking tasks được thay đổi.

Theo Celery FAQ, bạn nên sử dụng result.revoke:

>>> result = add.apply_async(args=[2, 2], countdown=120) 
>>> result.revoke() 

hoặc nếu bạn chỉ có id nhiệm vụ:

>>> from proj.celery import app 
>>> app.control.revoke(task_id) 
12

@ câu trả lời 0x00mh là đúng, tuy nhiên gần đây cần tây docs nói sử dụng tùy chọn terminate là "một phương sách cuối cùng cho quản trị viên" vì bạn có thể vô tình chấm dứt một tác vụ khác bắt đầu thực hiện trong thời gian chờ đợi. Có thể một giải pháp tốt hơn là kết hợp terminate=True với signal='SIGUSR1' (làm cho ngoại lệ SoftTimeLimitExceeded được nâng lên trong tác vụ).

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