Python Celery任务工作流程执行

时间:2015-11-06 22:10:57

标签: python canvas error-handling celery

我是Python Celery的新手,并尝试使用Celery进行工作流程执行。工作流程:Task workflow

在附图中,我试图显示工作流程,下面将以文字说明。

  1. 客户端调用Task-1。
  2. 如果Task-1成功,则执行Task-2和Task-3(同时),如果Task-1失败,则执行Task-4。
  3. 在任务-2成功时,执行任务-5和任务-6(同时),如果任务2失败,则执行任务7。
  4. 在Task-5成功时,执行大量(100s)Task-8(同时),如果Task-5失败,则执行Task-9。
  5. 当客户端调用Task-1时,它会传递一个参数,该参数需要传递给成功和失败场景中的下一个任务。

    我知道Canvas可以用来设计Celery的工作流程。但是,我无法弄清楚如何使用不同的成功和失败层次来完成这么大的工作流程。请建议我如何使用Celery和Canvas来规划这样的工作流程。 教程或示例的任何链接都将是一个很好的帮助。

2 个答案:

答案 0 :(得分:3)

Have you tried something like this? (pseudo code)

workflow = (t1.s().set(link_error=t4.s()) | 

            group((t2.s().set(link_error=t7.s()) |

                   group(t6.s(),
                        (t5.s().set(link_error=t9.s()) |
                         group(t8.s(i) for i in xrange(100)))),

                  t3.s())
            )
).apply_async()

link_error is the callback for errors.

http://docs.celeryproject.org/en/latest/userguide/canvas.html

答案 1 :(得分:0)

您可以使用包装器任务来处理调用其他任务的逻辑。

您的代码可能最终会出现类似内容。

@celery.task(name='tasks.wrapper_task')
def wrapper_task(one_arg):
    if task_one(one_arg):
        task_three.apply_async(arg_one)
        if task_two(arg_one):
            task_six.apply_async(arg_one)
            if task_five(arg_one): 
                task_eight.apply_async(1)
                task_eight.apply_async(2)
                # etc...
            else:
                task_nine(arg_one)
        else:
            task_seven(arg_one)
    else:
        task_four(arg_one)

我没有为您定义所有任务。正如您所看到的,除非您需要在其他情况下异步调用它们,否则并非所有都需要芹菜任务。

我已经'失败'意味着返回假,但您可以轻松调整代码以使用try / except