首页 > 解决方案 > 异步运行 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 秒,因此希望以异步模式运行它们,这样就不需要接近一个小时。

标签: pythonpython-3.xazureasynchronousazure-functions

解决方案


我最终通过他们的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

推荐阅读