如何将列表传递至Azure Durable Functions并调用activity函数
Azure Durable Functions Python 传参与配置问题解答
如何将listcreator()生成的字符串列表传递给orchestrator
你不需要额外引入中间存储、全局变量这类不可靠的传递方式,直接通过Durable客户端启动编排实例的入参传递即可,步骤如下:
- 修改现有HTTP触发的listcreator函数,添加Durable客户端输入绑定,在函数内生成目标列表后,调用编排启动方法时将列表作为入参传入
- orchestrator函数通过上下文对象直接获取传入的列表,即可循环/批量调用activity函数
对应代码参考:
修改后的listcreator代码
import azure.functions as func import azure.durable_functions as df async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse: client = df.DurableOrchestrationClient(starter) # 原有生成列表的逻辑,修正拼写错误 mylist = ['hello', 'world'] # 启动编排函数,将列表作为输入传入,将参数替换为你实际的编排函数名 instance_id = await client.start_new( orchestration_function_name="your_orchestrator_func_name", client_inputs=mylist ) # 返回编排实例状态查询响应 return client.create_check_status_response(req, instance_id)
对应orchestrator接收参数、调用activity的代码
import azure.durable_functions as df def orchestrator_function(context: df.DurableOrchestrationContext): # 直接获取listcreator传入的列表 input_list = context.get_input() task_list = [] # 遍历列表批量调用activity,支持并行执行 for item in input_list: task_list.append(context.call_activity("activity", item)) # 等待所有activity执行完成,汇总结果 final_results = yield context.task_all(task_list) return final_results main = df.Orchestrator.create(orchestrator_function)
listcreator对应的function.json绑定配置
需要在原有HTTP触发绑定基础上,新增Durable客户端的输入绑定,配置示例:
{ "scriptFile": "__init__.py", "bindings": [ { "authLevel": "anonymous", "type": "httpTrigger", "direction": "in", "name": "req", "methods": ["get", "post"] }, { "type": "http", "direction": "out", "name": "$return" }, { "name": "starter", "type": "durableClient", "direction": "in" } ] }
注意:不要用全局变量、本地临时文件的方式传递列表。Durable Functions编排存在重放机制,可能在不同进程、不同计算节点上运行,这类本地存储的内容无法被可靠读取,通过启动入参传递的内容会被持久化到Durable Functions的后端存储中,重放时可以稳定获取。
是否需要单独配置starter函数
不需要额外编写独立的starter函数。
starter的核心作用是持有Durable客户端实例、触发编排启动,HTTP触发、队列触发、Blob触发等任意类型的函数,只要配置了durableClient输入绑定,都可以作为starter使用。你现有已经实现了列表生成逻辑的listcreator,加上Durable客户端绑定后就可以直接承担starter的职责,不需要冗余新增单独的启动函数。
内容的提问来源于stack exchange,提问作者Stijn Koordijk
相关产品推荐
相关产品推荐

