Ho una catena di sedici che esegue alcune attività. Ognuno dei compiti può fallire ed essere riprovato. Si prega di vedere sotto per un esempio veloce:Riprovare le attività fallite di sedano che fanno parte di una catena
from celery import task
@task(ignore_result=True)
def add(x, y, fail=True):
try:
if fail:
raise Exception('Ugly exception.')
print '%d + %d = %d' % (x, y, x+y)
except Exception as e:
raise add.retry(args=(x, y, False), exc=e, countdown=10)
@task(ignore_result=True)
def mul(x, y):
print '%d * %d = %d' % (x, y, x*y)
e la catena:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
Esecuzione dei due compiti (e supponendo che nulla riesce), il vostro otterrebbe/si veda stampata:
1 + 2 = 3
3 * 4 = 12
Tuttavia, quando l'attività di aggiunta ha esito negativo la prima volta e riesce nelle successive chiamate di nuovo tentativo, il resto delle attività nella catena non viene eseguito, ovvero l'attività di aggiunta non riesce, tutte le altre attività della catena non vengono eseguite e dopo un ew secondi, l'attività di aggiunta viene eseguita nuovamente e ha esito positivo e il resto delle attività nella catena (in questo caso mul.si (3, 4)) non viene eseguito.
Il sedano fornisce un modo per continuare le catene guaste dall'attività che ha avuto esito negativo, in seguito? In caso contrario, quale sarebbe l'approccio migliore per ottenere questo risultato e assicurarsi che le attività di una catena vengano eseguite nell'ordine specificato e solo dopo che l'attività precedente è stata eseguita correttamente anche se l'attività viene ripetuta alcune volte?
Nota 1: Il problema può essere risolto facendo
add.delay(1, 2).get()
mul.delay(3, 4).get()
ma sono interessati a capire il motivo per cui le catene non funzionano con attività non riuscite.
Ho deciso di utilizzare un'attività a catena che esegue tutte le attività che altrimenti si troverebbero in una catena, ma attende l'esecuzione di un'attività prima di avviare l'altra, ad es .: 'task1.delay ([params]). ottenere(); . Task2.delay ([params]) get(); task3.delay ([params]). get() '. L'attività concatenata può rilevare le eccezioni sollevate da una qualsiasi attività e riprovare se stessa. – Andrei
Quindi dal tuo esempio, t1e e t2e dovrebbero chiamare t2 e, rispettivamente, t3, giusto? – Andrei
L'esempio sono solo i miei pensieri sulla possibile sintassi per catena. Significa che ogni attività successiva ora è effettivamente una coppia di attività, il primo elemento della coppia verrà chiamato se nessuna eccezione/errore si verifica nel passaggio precedente e il secondo elemento è il gestore di eccezioni/errori per l'errore del passaggio precedente. 't1e' significa' gestore di errori t1' Le catene – anh