芹菜:从任务

时间:2018-01-31 15:25:23

标签: python celery

当有人询问从另一个芹菜任务触发芹菜任务时,通常的答案是使用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)

然而,这有一些奇怪的属性:

  1. 整个工作流程的任务ID最终成为链中最终任务的任务ID,这实际上是一项与实际工作相关的任务。
  2. 要从工作流程中获得正确的结果,您只需将参数直接传递给send_notifications_task作为其返回值。输入不会以任何方式处理或转换。
  3. 所以,我的第一个问题是:

    在这种情况下,是否有任何理由不在第一项任务的主体内触发第二项任务,例如:

        @app.task
        def processing_task(input):
            output = process(input)
            send_notifications_task.delay(output)
            return output
    

    我的第二个问题是:有没有一种更好的方法可以处理我没有的这种情况?

0 个答案:

没有答案