- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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 任务不会超时,但也不会完成。它看起来只是在等待其他事情发生:
不知道我应该在这里做什么。我也在关注this thread on GitHub ,但这并没有导致解决。
最佳答案
除非您使用持久函数(此处不需要),否则 Azure Functions 不支持将后台作业作为函数执行的一部分。
一旦函数返回响应,该 channel 就会关闭,任何后台操作都无法按预期工作(异常(exception) - 持久函数)。
如果您需要像这样异步工作并且可以不等待响应,建议的方法是使用多个函数。
在这种情况下,您的 HttpTrigger 可能会在队列(或任何其他消息服务)中删除消息并立即返回响应。然后,您将有一个队列触发器(或其他基于事件的触发器)来从队列(或任何此类消息传递服务)中获取事件并完成繁重的工作,一旦完成,就可以发布到示例中的该端点。
如果您只想使用一个函数来实现这一点,那么您可以从您的 DevOps 管道中直接将消息发送到消息传递服务,并让您的函数触发该函数。
希望这有帮助!
关于azure - 如何在 DevOps 管道中对长时间运行的 Azure Functions 使用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963040/
我是一名优秀的程序员,十分优秀!