Ho un compito check_orders che viene eseguito periodicamente. Crea un gruppo di attività in modo da poter calcolare il tempo necessario per l'esecuzione delle attività ed eseguire qualcosa quando sono terminate (questo è lo scopo di res.join [1] e grouped_subs). Le attività raggruppate sono coppie di compiti concatenati.Il sedano interrompe l'esecuzione di una catena
Quello che voglio è quando la prima attività non soddisfa una condizione (non riuscita) non esegue la seconda attività nella catena. Non riesco a capirlo per la vita di me e ritengo che questa sia una funzionalità di base per un gestore di code di lavoro. Quando provo le cose che ho commentato dopo [2] (sollevando eccezioni, rimuovendo le callback) ... rimaniamo bloccati su join() in check_orders per qualche ragione (rompe il gruppo). Ho provato a impostare ignore_result su False per tutte queste attività, ma ancora non funziona.
@task(ignore_result=True)
def check_orders():
# check all the orders and send out appropriate notifications
grouped_subs = []
for thingy in things:
...
grouped_subs.append(chain(is_room_open.subtask((args_sub_1,)),
notify.subtask((args_sub_2,), immutable=True)))
res = group(grouped_subs).apply_async()
res.join() #[1]
logger.info('Done checking orders at %s' % current_task.request.id))
@task(ignore_result=True)
def is_room_open(args_sub_1):
#something time consuming
if http_req_and_parse(args_sub_1):
# go on and do the notify task
return True
else:
# [2]
# STOP THE CHAIN SOMEHOW! Don't execute the rest of the chain, how?
# None of the following things work:
# is_room_open.update_state(state='FAILURE')
# raise celery.exceptions.Ignore()
# raise Exception('spam', 'eggs')
# current_task.request.callbacks[:] = []
@task(ignore_result=True)
def notify(args_sub_2):
# something else time consuming, only do this if the first part of the chain
# passed a test (the chained tasks before this were 'successful'
notify_user(args_sub_2)
Grazie per i suggerimenti sulle scorciatoie. Sebbene funzioni, non risolve il mio problema. Voglio che il secondo compito non venga mai eseguito se il primo fallisce. Questa soluzione ha ancora il sovraccarico di avviare la seconda attività ogni volta indipendentemente dai risultati della prima attività. Voglio interrompere l'esecuzione della catena. – Salami
ti ho capito. Se l'attività ha generato un'eccezione, l'esecuzione della catena si interrompe. Il suo comportamento di default. Non è necessario cercare una decisione speciale per questo. –
@Alexander, sollevando l'eccezione NON funziona correttamente. "Quando provo le cose che ho commentato dopo [2] (sollevando eccezioni, rimuovendo le callback) ... rimaniamo bloccati su join() in check_orders per qualche ragione (rompe il gruppo)." – Salami