You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Azure Durable Functions示例代码以测量活动函数数量对链式调用响应时间的影响

修改Azure Durable Functions示例代码以测量活动函数数量对链式调用响应时间的影响

没问题,我帮你调整代码,让你能灵活控制链式调用里的活动函数数量,从而精准测量不同数量下的响应时间。下面是修改后的完整代码,我会把关键改动和使用说明都讲清楚:

关键改动思路

  • 去掉硬编码的固定活动函数调用,改为通过请求参数动态指定活动函数数量,方便快速测试不同场景
  • 合并重复的活动函数为一个通用函数,确保每个活动的耗时完全一致(都是10秒),避免测试偏差
  • 修正编排器里的时间计算逻辑:原来的代码没有等待活动函数执行完成就计算耗时,结果会完全不准,现在改为等待所有链式活动执行完毕后再统计总耗时

修改后的完整代码

import azure.functions as func
import azure.durable_functions as df
import logging
import time
from typing import Optional

app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

# 客户端函数:支持传入活动函数数量参数
@app.route(route="orchestrators/client_function")
@app.durable_client_input(client_name="client")
async def client_function(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse:
    # 从请求获取活动函数数量,默认值为2
    try:
        # 优先从query参数获取
        num_activities = int(req.params.get("num_activities", 2))
        # 如果是POST请求,也可以从JSON body获取
        if req.method == "POST":
            req_body = await req.get_json()
            num_activities = int(req_body.get("num_activities", num_activities))
    except ValueError:
        return func.HttpResponse("Invalid 'num_activities' parameter, must be an integer", status_code=400)

    # 启动编排器,传入活动数量参数
    instance_id = await client.start_new("orchestrator", None, {"num_activities": num_activities})
    logging.info(f"Started orchestration with ID = '{instance_id}' and {num_activities} activities.")

    # 等待编排完成并返回结果
    status = await client.get_status(instance_id)
    runtime = status.runtime_status
    output = status.output

    return func.HttpResponse(f"Runtime status: {runtime}\n\nTotal response time (seconds): {output}")

# 编排器函数:根据传入的数量顺序调用活动函数
@app.orchestration_trigger(context_name="context")
def orchestrator(context: df.DurableOrchestrationContext) -> float:
    # 获取传入的活动函数数量参数
    input_data = context.get_input()
    num_activities = input_data.get("num_activities", 2)

    # 记录链式调用开始时间
    start_time = time.time()

    # 顺序调用指定数量的活动函数(链式执行,前一个完成才开始下一个)
    for i in range(num_activities):
        # 调用通用活动函数,传入标识参数方便日志追踪
        await context.call_activity("sleep_activity", f"activity_{i+1}")

    # 计算总耗时:从第一个活动开始到最后一个活动结束的时间
    total_time = time.time() - start_time
    return round(total_time, 2)

# 通用活动函数:统一的sleep逻辑,确保每个活动耗时一致
@app.activity_trigger(input_name="activity_name")
def sleep_activity(activity_name: str):
    logging.info(f"Executing {activity_name}")
    # 每个活动固定sleep 10秒
    time.sleep(10)
    return f"{activity_name} completed"

使用说明

  1. 测试不同数量的活动函数:
    • 用GET请求:访问 http://localhost:7071/api/orchestrators/client_function?num_activities=5,就能测试5个活动函数链式调用的响应时间
    • 用POST请求:发送JSON body {"num_activities": 3} 到同一个地址,同样可以指定数量
  2. 验证结果:返回的响应里会显示总响应时间,你可以对比不同数量下的结果,比如2个活动理论上耗时约20秒,3个约30秒(实际会有少量Durable Functions的调度开销)

注意事项

  • 确保本地运行Durable Functions的环境正常,或者部署到Azure后测试
  • 日志里会显示每个活动的执行情况,方便排查问题
  • 如果需要调整活动函数的耗时,只需要修改sleep_activity里的time.sleep(10)即可

备注:内容来源于stack exchange,提问作者TY00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:18:06