タスクはメッセージであり、「定期的なタスク」は定期的な間隔でタスクメッセージを送信します。送信される各タスクには、一意のIDが割り当てられます。
revoke
1つのタスクメッセージのみをキャンセルします。タスクのIDを取得するには、送信されたIDを追跡する必要がありますが、タスクを送信するときにカスタムIDを指定することもできます。
1つのタスクメッセージをキャンセルするのか、それとも定期的なタスクがそれ以上メッセージを送信しないようにするのかわからないので、両方の回答をリストします。
定期的なタスクで送信されるタスクのIDを保持する組み込みの方法はありませんが、各タスクのIDを定期的なタスクの名前に設定できます。これにより、IDは定期的なタスクで送信されるすべてのタスクを参照します。 (通常は最後のもの)。この方法でカスタムIDを指定できます。
@periodic_task
デコレータのいずれか:
@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
pass
またはCELERYBEAT_SCHEDULE
設定で:
CELERYBEAT_SCHEDULE = {name: {"task": task_name,
"options": {"task_id": name}}}
定期的なタスクを削除する場合は@periodic_task
、コードベースからを削除するか、からエントリを削除しCELERYBEAT_SCHEDULE
ます。Djangoデータベーススケジューラを使用している場合は、Django管理インターフェースから定期的なタスクを削除する必要があります。
PS1:revoke
すでに開始されているタスクを停止しません。まだ開始されていないタスクのみをキャンセルします。を使用して、実行中のタスクを終了できます
revoke(task_id, terminate=True)
。デフォルトでは、これはTERM
信号をプロセスに送信します。別の信号(KILLなど)を送信する場合は、を使用します
revoke(task_id, terminate=True, signal="KILL")
。
PS2:revokeはリモートコントロールコマンドであるため、RabbitMQおよびRedisブローカートランスポートでのみサポートされます。タスクでキャンセルをサポートする場合はcancelled
、データベースにフラグを保存し、開始時にタスクにそのフラグをチェックさせる必要があります。
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)