4.5 - 工作流超时
工作流超时
每类工作流超时控制工作流执行中不同方面的最长持续时间。
不建议设置工作流超时,因为工作流被设计为长期运行且具有弹性。设置超时可能限制其处理意外延迟或长时间处理的能力。如果需要在特定时间后在工作流内部执行操作,建议使用计时器(Timer)。
在启动工作流执行时,设置工作流超时。
- Workflow Execution Timeout(工作流执行超时):限制单次工作流执行的最大运行时间。
- Workflow Run Timeout(工作流运行超时):限制单次工作流运行的最大持续时间。
- Workflow Task Timeout(工作流任务超时):限制 Worker 执行单个工作流任务的最大时间。
请在 start_workflow() 或 execute_workflow() 异步方法中设置超时参数。
可用的超时参数包括:
execution_timeout
run_timeout
task_timeout
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())