gpt4 book ai didi

azure - 如何在 DevOps 管道中对长时间运行的 Azure Functions 使用回调?

转载 作者:行者123 更新时间:2023-12-03 04:07:39 26 4
gpt4 key购买 nike

我有一个 Azure DevOps 发布管道,用于部署 Python Azure 函数,然后调用它。 Python 函数执行一些繁重的工作,因此需要几分钟才能执行。

调用 Azure Function 任务的完成事件有两个选项:Api 响应回调.0

使用Api Response时的最大响应时间是20秒,所以我需要使用Callback。好的。使用this documentation ,我实现了一个 Azure 函数,该函数立即返回 HTTPResponse,然后将完成数据发布到指定的终结点。以下是我的 Azure 函数的完整代码:

import logging
import time
import threading

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:

t = threading.Thread(target=do_work, args=(req,))
t.start()

return func.HttpResponse("Succeeded", status_code=200)

def do_work(req: func.HttpRequest):

logging.info ("Starting asynchronous worker task")

#time.sleep(21)

try:
planUrl = req.headers["PlanUrl"]
projectId = req.headers["ProjectId"]
hubName = req.headers["HubName"]
planId = req.headers["PlanId"]
taskInstanceId = req.headers["TaskInstanceId"]
jobId = req.headers["JobId"]

endpoint = f"{planUrl}/{projectId}/_apis/distributedtask/hubs/{hubName}/plans/{planId}/events?api-version=2.0-preview.1"
body = {
"name": "TaskCompleted",
"taskId": taskInstanceId,
"jobId": jobId,
"result": "succeeded"
}
logging.info(endpoint)
logging.info(body)
requests.post(endpoint, data=body)

except:
pass

finally:
logging.info ("Completed asynchronous worker task")

现在,调用 Azure Function 任务不会超时,但也不会完成。它看起来只是在等待其他事情发生:

Waiting around to die

不知道我应该在这里做什么。我也在关注this thread on GitHub ,但这并没有导致解决。

最佳答案

除非您使用持久函数(此处不需要),否则 Azure Functions 不支持将后台作业作为函数执行的一部分。

一旦函数返回响应,该 channel 就会关闭,任何后台操作都无法按预期工作(异常(exception) - 持久函数)。

如果您需要像这样异步工作并且可以不等待响应,建议的方法是使用多个函数。

在这种情况下,您的 HttpTrigger 可能会在队列(或任何其他消息服务)中删除消息并立即返回响应。然后,您将有一个队列触发器(或其他基于事件的触发器)来从队列(或任何此类消息传递服务)中获取事件并完成繁重的工作,一旦完成,就可以发布到示例中的该端点。

如果您只想使用一个函数来实现这一点,那么您可以从您的 DevOps 管道中直接将消息发送到消息传递服务,并让您的函数触发该函数。

希望这有帮助!

关于azure - 如何在 DevOps 管道中对长时间运行的 Azure Functions 使用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com