Domanda

Voglio avere un'attività che eseguirà ogni 5 minuti, ma aspetterà che l'ultima esecuzione finisca e quindi inizierà a contare questi 5 minuti. (In questo modo posso anche essere sicuro che esiste solo un'attività in esecuzione) Il modo più semplice che ho trovato è eseguire l'applicazione Django Gesty.py Shell ed eseguire questo:

while True:
    result = task.delay()
    result.wait()
    sleep(5)

Ma per ogni attività che voglio eseguire in questo modo devo eseguire la propria conchiglia, c'è un modo semplice per farlo? Potrebbe essere un programma King Custom OT Django Celery?

È stato utile?

Soluzione

Tutto ciò di cui hai bisogno è specificare in Celery Conf Witch Task che si desidera eseguire periodicamente e con quale intervallo.

Esempio: eseguire le attività. Aggiungi l'attività ogni 30 secondi

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
     },
}

Ricorda che devi eseguire il sedano in modalità beat con l'opzione -b

manage celeryd -B

Puoi anche usare lo stile Crrontab anziché l'intervallo di tempo, controlla questo:

http://ask.github.com/celery/userguide/periodic-tasks.html

Se stai usando Django-Celery, ricorda che puoi anche usare il Django DB come scheduler per attività periodiche, in questo modo puoi facilmente aggiungere attraverso il pannello di amministrazione Django-Celery Nuovi compiti periodici. Per fare ciò, è necessario impostare lo scheduler Celerybeat in Impostas.py in questo modo

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

Altri suggerimenti

Wow, è incredibile come nessuno capisca la domanda di questa persona. Stanno chiedendo di non eseguire periodicamente attività, ma come garantire che il sedano non esegui due istanze dello stesso compito contemporaneamente. Non credo che ci sia un modo per farlo direttamente con il sedano, ma quello che puoi fare è avere una delle attività che acquisiscono una serratura proprio quando inizia, e se fallisce, riprovare in pochi secondi (usando Retry) . L'attività rilascerebbe il blocco subito prima del ritorno; È possibile effettuare l'auto-espirare il blocco dopo pochi minuti se si schianta o si schiantò.

Per il blocco probabilmente puoi semplicemente usare il tuo database o qualcosa come Redis.

Potresti essere interessato a questo metodo più semplice che non richiede modifiche a una configurazione di sedano.

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def my_task():
    # Insert fun-stuff here

Per espandersi sul post di @maurorocco, da http://docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.html

L'uso di un Timedelta per il programma significa che l'attività verrà eseguita 30 secondi dopo l'inizio del sedano, quindi ogni 30 secondi dopo l'ultima corsa. Esiste anche un programma come Crrontab, consultare la sezione sugli orari di Crrontab.

Quindi questo raggiungerà davvero l'obiettivo che desideri.

A causa del sedano. Deprecati, è possibile utilizzare il decoratore periodico_task del genere:

from celery.task.base import periodic_task
from django.utils.timezone import timedelta

@periodic_task(run_every=timedelta(seconds=5))
def my_background_process():
    # insert code

Aggiungi quell'attività a una coda separata, quindi utilizza un lavoratore separato per quella coda con l'opzione di concorrenza impostata su 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top