当有人询问从另一个芹菜任务触发芹菜任务时,通常的答案是使用chain
,例如:
workflow = celery.chain(first_task.s(a, b), triggered_task.s())
然而,当触发的任务没有转换第一个任务的结果时,这看起来很奇怪。举例来说,您要进行一些处理,然后在处理完成后发送一些电子邮件通知。您可以使用chain
执行此操作:
@app.task
def processing_task(input):
return process(input)
@app.task
def send_notifications_task(previous_result):
message = create_message(previous_result)
send_to_chat_channel(message)
return previous_result
processing_workflow = chain(
processing_task.s(),
send_notifications_task.s()
)
你这样称呼:
async_result = workflow.delay(input)
然而,这有一些奇怪的属性:
send_notifications_task
作为其返回值。输入不会以任何方式处理或转换。所以,我的第一个问题是:
在这种情况下,是否有任何理由不在第一项任务的主体内触发第二项任务,例如:
@app.task
def processing_task(input):
output = process(input)
send_notifications_task.delay(output)
return output
我的第二个问题是:有没有一种更好的方法可以处理我没有的这种情况?