4.5 - 工作流超时

工作流超时

每类工作流超时控制工作流执行中不同方面的最长持续时间。

不建议设置工作流超时,因为工作流被设计为长期运行且具有弹性。设置超时可能限制其处理意外延迟或长时间处理的能力。如果需要在特定时间后在工作流内部执行操作,建议使用计时器(Timer)。

在启动工作流执行时,设置工作流超时。

请在 start_workflow() 或 execute_workflow() 异步方法中设置超时参数。

可用的超时参数包括:

import asyncio
from datetime import timedelta
from temporalio.client import Client
from your_workflows import YourWorkflow
from temporalio.common import RetryPolicy


async def main():
    client = await Client.connect("localhost:7233")

    result = await client.execute_workflow(
        YourWorkflow.run,
        "your timeout argument",
        id="your-workflow-id",
        task_queue="your-task-queue",
# Set Workflow Timeout duration
        execution_timeout=timedelta(seconds=2),
# run_timeout=timedelta(seconds=2),
# task_timeout=timedelta(seconds=2),
    )
    handle = await client.execute_workflow(
        YourWorkflow.run,
        "your retry policy argument",
        id="your-workflow-id",
        task_queue="your-task-queue",
        retry_policy=RetryPolicy(maximum_interval=timedelta(seconds=2)),
    )

    print(f"Result: {result}")
    print(f"Handle: {handle}")


if __name__ == "__main__":
    asyncio.run(main())

工作流重试

重试策略可以与超时配合使用,提供精细控制,优化执行体验。

使用重试策略可在工作流执行发生故障时进行重试。

工作流执行默认不重试,重试策略应仅在特定情况下与工作流执行配合使用。

可在 start_workflow() 或 execute_workflow() 异步方法中设置重试策略。

import asyncio
from datetime import timedelta
from temporalio.client import Client
from your_workflows import YourWorkflow
from temporalio.common import RetryPolicy


async def main():
    client = await Client.connect("localhost:7233")

    result = await client.execute_workflow(
        YourWorkflow.run,
        "your timeout argument",
        id="your-workflow-id",
        task_queue="your-task-queue",
        # Set Workflow Timeout duration
        execution_timeout=timedelta(seconds=2),
        # run_timeout=timedelta(seconds=2),
        # task_timeout=timedelta(seconds=2),
    )
    handle = await client.execute_workflow(
        YourWorkflow.run,
        "your retry policy argument",
        id="your-workflow-id",
        task_queue="your-task-queue",
        retry_policy=RetryPolicy(maximum_interval=timedelta(seconds=2)),
    )

    print(f"Result: {result}")
    print(f"Handle: {handle}")


if __name__ == "__main__":
    asyncio.run(main())