Hủy một nhiệm vụ đã thực hiện với Celery?


91

Tôi đã đọc tài liệu và tìm kiếm nhưng dường như không thể tìm thấy câu trả lời thẳng thắn:

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

Tôi tìm thấy cái này từ tài liệu tại Celery FAQ

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

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

Câu trả lời:


179

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

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

thu hồi có một tùy chọn kết thúc là Sai theo mặc định. Nếu bạn cần kết thúc tác vụ đang thực thi, bạn cần đặt kết thúc thành True .

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

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


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

1
Điều này có hoạt động trong một env phân tán không? Ý tôi là nếu tôi có công nhân trên nhiều máy đang thực thi các tác vụ. Cần tây có theo dõi tác vụ đang thực thi trên máy nào không?
ksrini

1
Nó có. Việc giao tiếp với người lao động diễn ra thông qua người môi giới.
mher

4
result.revoke (chấm dứt = True) nên làm điều tương tự như rút lại (task_id, chấm dứt = True)
CamHart

9
Ngoài ra, sử dụng tùy chọn chấm dứt là "phương sách cuối cùng dành cho quản trị viên", theo tài liệu gần đây của Celery. Bạn có nguy cơ chấm dứt một tác vụ khác gần đây đã bắt đầu trên công nhân đó.
kouk


25

Câu trả lời của @ 0x00mh là đúng, tuy nhiên các tài liệu về cần tây gần đây nói rằng sử dụng terminatetùy chọn này là " phương sách cuối cùng dành 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 thi trong thời gian chờ đợi. Có thể một giải pháp tốt hơn là kết hợp terminate=Truevới signal='SIGUSR1'(khiến ngoại lệ SoftTimeLimitExceeded được đưa ra trong tác vụ).


2
Giải pháp này đã làm việc rất tốt cho tôi. Khi SoftTimeLimitExceededđược nêu ra trong nhiệm vụ của tôi, logic dọn dẹp tùy chỉnh của tôi (được triển khai qua try/ except/ finally) sẽ được gọi. Theo quan điểm của tôi, điều này tốt hơn nhiều so với những gì AbortableTaskcung cấp ( docs.celeryproject.org/en/latest/reference/… ). Với thứ hai, bạn cần một chương trình phụ trợ kết quả cơ sở dữ liệu bạn phải kiểm tra thủ công và liên tục trạng thái của một tác vụ đang diễn ra để xem liệu nó có bị hủy bỏ hay không.
David Schneider,

2
Làm thế nào là điều này tốt hơn, theo như tôi hiểu nếu có bất kỳ nhiệm vụ nào khác được thực hiện bởi quy trình, nó sẽ bị dừng lại, chỉ cần một ngoại lệ khác sẽ được ném ra.
marxin 14/1218

Nếu tôi sử dụng worker_prefetch_multiplier = 1vì tôi chỉ có một vài tác vụ đang chạy lâu dài thì việc chấm dứt sẽ ổn - vì không có tác vụ nào khác sẽ bị ảnh hưởng bởi việc chấm dứt - tôi có hiểu đúng không? @spicyramen
maffe


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.