Ich habe eine check_orders Task, die in regelmäßigen Abständen ausgeführt wird. Es macht eine Gruppe von Aufgaben, so dass ich die Ausführungszeit der Aufgaben bestimmen kann, und wenn alle erledigt sind (dies ist der Zweck von res.join [1] und grouped_subs). Die Aufgaben, die gruppiert sind, sind Paare von verkettete Aufgaben.Sellerie Stop Ausführung einer Kette
Was ich will ist, wenn die erste Aufgabe eine Bedingung nicht erfüllt (fehlschlägt) führen Sie nicht die zweite Aufgabe in der Kette. Ich kann das nicht für das Leben von mir herausfinden und ich denke, das ist ziemlich grundlegende Funktionalität für einen Jobwarteschlangenmanager. Wenn ich die Dinge ausprobiere, die ich nach [2] auskommentiert habe (Ausnahmen auslösen, Callbacks entfernen) ... bleiben wir aus irgendeinem Grund in der join() in check_orders stecken (es bricht die Gruppe). Ich habe versucht, ignore_result für alle diese Aufgaben auf False zu setzen, aber es funktioniert immer noch nicht.
@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)
Vielen Dank für die Tipps über Verknüpfungen. Obwohl das funktionieren würde, löst es mein Problem nicht. Ich möchte, dass die zweite Aufgabe niemals ausgeführt wird, wenn die erste fehlschlägt. Diese Lösung hat immer noch den Aufwand, die zweite Aufgabe jedes Mal unabhängig von den Ergebnissen der ersten Aufgabe zu starten. Ich möchte die Ausführung der Kette stoppen. – Salami
Ich habe dich verstanden. Wenn die Aufgabe ausgelöst wird, wird die Ausführung der Kette gestoppt. Sein Verhalten ist standardmäßig. Sie müssen keine spezielle Entscheidung dafür suchen. –
@Alexander, das Anheben der Ausnahme funktioniert NICHT richtig. "Wenn ich die Dinge ausprobiere, die ich nach [2] auskommentiert habe (Ausnahmen auslösen, Rückrufe entfernen) ... bleiben wir aus irgendeinem Grund in der join() in check_orders stecken (es bricht die Gruppe auf)." – Salami