Un compito è un messaggio, e un "task periodico" invia messaggi di attività a intervalli periodici. A ciascuna attività inviata verrà assegnato un ID univoco.
revoke
sarà annullare un solo messaggio compito. Per ottenere l'id per un'attività, è necessario mantenere la traccia dell'ID inviato, ma è anche possibile specificare un ID personalizzato quando si invia un'attività.
non sono sicuro se si desidera annullare un singolo messaggio compito, o se si vuole interrompere l'attività periodica di inviare più messaggi, quindi ti elenco risposte per entrambi.
Non c'è modo integrato per mantenere l'id di un compito inviato con attività periodiche, ma si potrebbe impostare l'ID per ogni attività per il nome del task periodico, in questo modo l'id farà riferimento a qualsiasi attività inviata con l'attività periodica (di solito l'ultima). È possibile specificare un ID personalizzato in questo modo,
sia con il @periodic_task
decoratrice:
@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
pass
o con l'impostazione CELERYBEAT_SCHEDULE
:
CELERYBEAT_SCHEDULE = {name: {"task": task_name,
"options": {"task_id": name}}}
Se si desidera rimuovere un task periodico è sufficiente rimuovere @periodic_task
dalla codebase o rimuovere la voce da CELERYBEAT_SCHEDULE
. Se si utilizza lo scheduler del database Django, è necessario rimuovere l'attività periodica dall'interfaccia di Django Admin.
PS1: revoke
non si ferma un compito che è già stato avviato. Annulla solo le attività che non sono state ancora avviate. È possibile interrompere un'attività in esecuzione utilizzando revoke(task_id, terminate=True)
. Per impostazione predefinita, invierà il segnale TERM
al processo , se si desidera inviare un altro segnale (ad esempio KILL) utilizzare revoke(task_id, terminate=True, signal="KILL")
.
PS2: revoke è un comando di controllo remoto, pertanto è supportato solo dai trasporti RabbitMQ e Redis broker. Se volete che il vostro compito di sostenere la cancellazione si dovrebbe fare in modo da memorizzare una bandiera cancelled
in un database e fare controllare il compito che la bandiera quando inizia:
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)
Grazie per questa risposta estremamente approfondita. –