Tác vụ là một tin nhắn và "tác vụ định kỳ" gửi thông báo tác vụ theo các khoảng thời gian định kỳ. Mỗi tác vụ được gửi sẽ có một id duy nhất được gán cho nó.
revoke
sẽ chỉ hủy một thông báo tác vụ duy nhất. Để lấy id cho tác vụ, bạn phải giữ bản nhạc của id được gửi, nhưng bạn cũng có thể chỉ định id tùy chỉnh khi bạn gửi tác vụ.
Tôi không chắc chắn nếu bạn muốn hủy một thông báo tác vụ duy nhất, hoặc nếu bạn muốn dừng tác vụ định kỳ gửi nhiều tin nhắn hơn, vì vậy tôi sẽ liệt kê các câu trả lời cho cả hai.
Không có cách tích hợp để giữ id của tác vụ được gửi với nhiệm vụ định kỳ, nhưng bạn có thể đặt id cho mỗi tác vụ thành tên của tác vụ định kỳ, theo cách đó id sẽ tham chiếu đến bất kỳ nhiệm vụ được gửi với nhiệm vụ định kỳ (thường là tác vụ cuối cùng). Bạn có thể chỉ định một id tùy chỉnh theo cách này,
hoặc với @periodic_task
trang trí:
@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
pass
hoặc với các thiết lập CELERYBEAT_SCHEDULE
:
CELERYBEAT_SCHEDULE = {name: {"task": task_name,
"options": {"task_id": name}}}
Nếu bạn muốn loại bỏ một công việc định kỳ bạn chỉ cần loại bỏ các @periodic_task
từ codebase, hoặc loại bỏ các mục từ CELERYBEAT_SCHEDULE
. Nếu bạn đang sử dụng bộ lập lịch cơ sở dữ liệu Django, bạn phải xóa nhiệm vụ định kỳ khỏi giao diện Quản trị Django.
PS1: revoke
không dừng tác vụ đã được bắt đầu. Nó chỉ hủy bỏ các nhiệm vụ chưa được bắt đầu. Bạn có thể chấm dứt tác vụ đang chạy bằng cách sử dụng revoke(task_id, terminate=True)
. Theo mặc định, điều này sẽ gửi tín hiệu TERM
tới quy trình, nếu bạn muốn gửi một tín hiệu khác (ví dụ: KILL) sử dụng revoke(task_id, terminate=True, signal="KILL")
.
PS2: thu hồi là lệnh điều khiển từ xa nên nó chỉ được hỗ trợ bởi giao thông vận tải RabbitMQ và Redis. Nếu bạn muốn công việc của bạn để hỗ trợ hủy bạn nên làm như vậy bằng cách lưu trữ một lá cờ cancelled
trong một cơ sở dữ liệu và có nhiệm vụ kiểm tra cờ khi nó bắt đầu:
from celery.task import Task
class RevokeableTask(Task):
"""Task that can be revoked.
Example usage:
@task(base=RevokeableTask)
def mytask():
pass
"""
def __call__(self, *args, **kwargs):
if revoke_flag_set_in_db_for(self.request.id):
return
super(RevokeableTask, self).__call__(*args, **kwargs)
Cảm ơn bạn vì câu trả lời cực kỳ kỹ lưỡng này. –