跳到内容

分支和循环#

工作流的一个关键特性是它们能够实现分支和循环逻辑,比基于图的方法更简单、更灵活。

工作流中的循环#

要创建一个循环,我们将使用前一个教程中的示例 `MyWorkflow` 并添加一个新的自定义事件类型。我们将它命名为 `LoopEvent`,但同样它可以是任何任意名称。

class LoopEvent(Event):
    loop_output: str

现在我们将 `import random` 并修改 `step_one` 函数,使其随机决定是循环还是继续。

@step
async def step_one(self, ev: StartEvent | LoopEvent) -> FirstEvent | LoopEvent:
    if random.randint(0, 1) == 0:
        print("Bad thing happened")
        return LoopEvent(loop_output="Back to step one.")
    else:
        print("Good thing happened")
        return FirstEvent(first_output="First step complete.")

让我们可视化这个

A simple loop

通过定义适当的事件类型和返回类型,您可以从任何一个步骤创建到任何其他步骤的循环。

工作流中的分支#

与循环密切相关的是分支。正如您已经看到的,您可以有条件地返回不同的事件。让我们看一个分支到两个不同路径的工作流。

class BranchA1Event(Event):
    payload: str


class BranchA2Event(Event):
    payload: str


class BranchB1Event(Event):
    payload: str


class BranchB2Event(Event):
    payload: str


class BranchWorkflow(Workflow):
    @step
    async def start(self, ev: StartEvent) -> BranchA1Event | BranchB1Event:
        if random.randint(0, 1) == 0:
            print("Go to branch A")
            return BranchA1Event(payload="Branch A")
        else:
            print("Go to branch B")
            return BranchB1Event(payload="Branch B")

    @step
    async def step_a1(self, ev: BranchA1Event) -> BranchA2Event:
        print(ev.payload)
        return BranchA2Event(payload=ev.payload)

    @step
    async def step_b1(self, ev: BranchB1Event) -> BranchB2Event:
        print(ev.payload)
        return BranchB2Event(payload=ev.payload)

    @step
    async def step_a2(self, ev: BranchA2Event) -> StopEvent:
        print(ev.payload)
        return StopEvent(result="Branch A complete.")

    @step
    async def step_b2(self, ev: BranchB2Event) -> StopEvent:
        print(ev.payload)
        return StopEvent(result="Branch B complete.")

我们的导入与之前相同,但我们创建了 4 个新的事件类型。`start` 随机决定选择一个分支或另一个,然后每个分支中的多个步骤完成工作流。让我们可视化这个。

A simple branch

您当然可以按任意顺序组合分支和循环,以满足您的应用程序需求。在本教程的后面部分,您将学习如何使用 `send_event` 并行运行多个分支,并使用 `collect_events` 同步它们。

接下来我们将学习使用 Context 维护状态