2012-07-26 11 views
30

Ho un'attività in Celery che potrebbe potenzialmente funzionare per 10.000 secondi mentre funziona normalmente. Comunque tutto il resto dei miei compiti dovrebbe essere fatto in meno di un secondo. Come posso impostare un limite di tempo per l'attività intenzionalmente lunga durata senza modificare il limite di tempo per le attività di breve durata?Impostazione del limite di tempo per attività specifiche con il sedano

risposta

44

È possibile impostare i limiti di tempo di attività (hard e/o soft) durante la definizione di un'attività o durante la chiamata.

from celery.exceptions import SoftTimeLimitExceeded 

@celery.task(time_limit=20) 
def mytask(): 
    try: 
     return do_work() 
    except SoftTimeLimitExceeded: 
     cleanup_in_a_hurry() 

o

mytask.apply_async(args=[], kwargs={}, time_limit=30, soft_time_limit=10) 
+0

nota che gli argomenti timeout/soft_timeout a apply_async è disponibile solo nella versione di sviluppo di sedano (ramo principale, versione futura 3.1) – asksol

+10

È inoltre possibile impostare i limiti di tempo per un'attività in configurazione usando: 'CELERY_ANNOTATIONS = {'module.mytask': {'time_limit': 20.0}}' – asksol

+6

Per le versioni di sedici 3.1.x sembra che gli argomenti 'timeout/soft_timeout' su' apply_async' siano stati anche cambiato in "time_limit/soft_time_limit'. La modifica rilevante è stata introdotta qui: https://github.com/celery/celery/commit/be6cef2e441e5ecf5857aeb77bd885f06128b9c9 – sanchitarora

5

Questo è un esempio di un decoratore specifica attività e sedano 3.1.23 usando soft_time_limit = 10000

@task(bind=True, default_retry_delay=30, max_retries=3, soft_time_limit=10000) 
def process_task(self, task_instance): 
    """Task processing.""" 
     pass 
+0

Puoi anche assegnare 'time_limit' insieme come' @task (soft_time_limit = 10, time_limit = 15) ' –

Problemi correlati