python - 异步运行 Azure Durable Function
问题描述
我正在尝试在 Azure 中运行异步函数,据我所知,这是使用 Azure 中的持久函数完成的。我一直在使用 Microsoft 的教程文档,但它似乎并没有真正异步运行。
这是构造函数演示
import azure.functions as func
import azure.durable_functions as df
def orchestrator_function(context: df.DurableOrchestrationContext):
result1 = yield context.call_activity('E1_SayHello', "Tokyo")
result2 = yield context.call_activity('E1_SayHello', "Seattle")
result3 = yield context.call_activity('E1_SayHello', "London")
return [result1, result2, result3]
main = df.Orchestrator.create(orchestrator_function)
这是被调用的函数
def main(name: str) -> str:
logging.info(f"Hello {name}!")
return f"Hello {name}!"
这很好用,您很快就会得到“Hello {City}!”的三个响应。你会期望的。但它似乎一次调用一个,等待中间的响应。如果您稍微更改函数并在其中放置一个如下所示的睡眠函数,则每个响应相隔 10 秒,其中所需的结果是它们将同时被调用,然后等待所有 3 个的结果。
def main(name: str) -> str:
time.sleep(10)
logging.info(f"Hello {name}!")
return f"Hello {name}!"
我尝试用 context.wait_for_external_event 替换 context.call_activity 但这有类似的结果,并且文档的许多部分仅在 C# 和 JavaScript 中,所以我不知道是否没有 Python 的等价物或者它只是没有完整记录。
最终目标是能够使用列表中保存的各种参数进行大量 API 调用(60+),在写入数据库之前清理数据。目前,每次 API 调用只需不到 60 秒,因此希望以异步模式运行它们,这样就不需要接近一个小时。
解决方案
我最终通过他们的Github 示例代码找到了答案,所以我把它放在这里以防其他人正在搜索。
您需要先将 context.call_activity 函数放入一个列表中,然后将该列表用作 yield context.task_all 中的函数变量,如下所示。
def orchestrator_function(context: df.DurableOrchestrationContext):
tasks = []
cities = ["Tokyo", "Seattle", "London"]
for city in cities:
tasks.append(context.call_activity('Hello', city))
results = yield context.task_all(tasks)
return results
推荐阅读
- javascript - 使用数组索引重新排序后获取两个数组之间的状态
- google-cloud-platform - 谷歌云平台修复 SSH
- .net-core - 是否可以为 dotnet watch 命令添加延迟?
- r - 如何在同一图表上绘制多条线?
- python - 如何在 Django 休息框架中将 DateTime 过滤为空?
- c# - 无法加载 DLL 'onnxruntime' 或其依赖项之一 ML.NET
- r - R从data.table列中提取字符串
- android - android webview下方不需要的空格
- snakemake - 如何读取 config.yaml 文件并将其输入到 snakemake
- javascript - 将多个脚本标签附加到在 React 中同步执行的头部