Pipelining

Single pipelining:

@app.task()
def do_things():
    ...

@app.task("after task 'do_things'")
def do_after_success():
    ...

@app.task("after task 'do_things' succeeded")
def do_after_success_2():
    ...

@app.task("after task 'do_things' failed")
def do_after_fail():
    ...

@app.task("after task 'do_things' finished")
def do_after_fail_or_success():
    ...

You can also pipe multiple at the same time to avoid long logical statements:

@app.task()
def do_a():
    ...

@app.task()
def do_b():
    ...


@app.task("after tasks 'do_a', 'do_b' succeeded")
def do_all_succeeded():
    ...

@app.task("after any tasks 'do_a', 'do_b' succeeded")
def do_any_succeeded():
    ...

@app.task("after any tasks 'do_a', 'do_b' failed")
def do_any_failed():
    ...

@app.task("after any tasks 'do_a', 'do_b' finished")
def do_any_failed_or_succeeded():
    ...