为什么我的python定时器触发器函数没有在正确的时间运行?
这可能是一个很难回答的问题。我有一个Azure函数,它可以响应HTTP请求,并且运行良好,我可以从浏览器或Python 3.8脚本调用它 我想创建另一个函数,该函数将具有为什么我的python定时器触发器函数没有在正确的时间运行?,python,azure,azure-functions,azure-functions-runtime,azure-function-app,Python,Azure,Azure Functions,Azure Functions Runtime,Azure Function App,这可能是一个很难回答的问题。我有一个Azure函数,它可以响应HTTP请求,并且运行良好,我可以从浏览器或Python 3.8脚本调用它 我想创建另一个函数,该函数将具有计时器触发器,并将按计划调用HTTP触发器函数 HTTP触发器函数返回带有执行结果的简单字符串 现在,我的计时器触发函数的代码使用Python请求,它每次都在本地工作,但部署到Azure时只能工作1/10次。其他情况下,当达到30分钟超时时,它返回错误。整个过程最多只能运行1-2分钟,所以我不知道它在哪里卡住了 成功时,它可以工
计时器触发器
,并将按计划调用HTTP触发器函数
HTTP触发器函数
返回带有执行结果的简单字符串
现在,我的计时器触发函数
的代码使用Python请求
,它每次都在本地工作,但部署到Azure时只能工作1/10次。其他情况下,当达到30分钟超时时,它返回错误。整个过程最多只能运行1-2分钟,所以我不知道它在哪里卡住了
成功时,它可以工作(我可以在HTTP触发器脚本的后端看到),但在azure日志中,记录器保存404错误
页面html,而不是HTTP触发器函数应返回的字符串
以下是定时器触发功能的代码:
import datetime
import logging
import azure.functions as func
import requests
def main(mytimer: func.TimerRequest) -> None:
URL = "https://rob-functions.azurewebsites.net/api/ss_kite_scrape_http"
r = requests.get(url = URL)
data = r.text
logging.info(f'TIMER TRIGGER HAS RUN. RESULT:{data}')
如何排除故障或修复此问题?日志记录问题并不重要,但超时问题必须以某种方式解决,我不知道从何处开始,因为它在本地工作得很好。根据一些测试,我遇到了与您类似的问题。我用默认代码创建了一个HttpTrigger(我在其中添加了一行time.sleep(20)
)。然后,我创建了一个TimerTrigger(cron表达式是0*/1****
),它带有请求
模块来调用HttpTrigger函数。这两个功能在一个功能应用程序中,似乎问题是由两个功能相互作用引起的,但我不知道为什么。这两个函数的代码看起来都不错
为了解决这个问题,我在不同的函数应用程序中创建了两个函数(HttpTrigger和TimerTrigger),并将它们部署到azure中的两个函数应用程序中。然后它工作正常,它们不会相互影响
希望能有所帮助~下面的问题现在已经解决了,尽管我还没有确认
关于这一点,某些cron表达式似乎存在某种问题。例如,请参阅我的。因此,我使用了一个cron表达式“0-59****”
,这导致我的函数应用程序停止轮询,没有出现错误:
根据本文中的信息,我将cron更改为“0*/2****”
,现在我的函数按预期工作
在中,我要求对这种行为进行解释。我可以知道计时器触发器的频率或计时器触发器的cron表达式吗?在httpTrigger函数中是否将authLevel属性设置为“function”?因为您没有在URL中传递任何?code=值(如果在创建应用程序时使用默认设置,则需要使用功能键)。@HuryShen是的,我测试的频率为“0 1 10-20/1***”。(协调世界时10:00至20:00之间每小时1分钟)。它确实会正确触发,但有时会超时。@DjerroNeth我没有为HTTP触发器函数使用任何参数,authLevel设置为Anonymous。您可以在浏览器中尝试上面代码中的URL,它应该可以工作,并在10-20秒后返回字符串。此处相同。如果一个HttpTrigger函数调用另一个HttpTrigger函数,则不会发生这种情况,但是对于另一个触发器(我尝试了BlobTrigger和QueueTrigger),我也遇到了同样的问题。此外,我没有看到第二个(链接)函数的任何日志。谢谢,我将在下周尝试此功能,并让您知道结果。嗨@robliv,我可以知道它是否可以解决您的问题吗?谢谢Hury!对不起,我没能早点测试这个。你的解决方案非常有效。将相同的计时器触发器放在不同的功能应用程序中,它现在可以工作10/10次。奇怪的是,微软如何设计这样相互冲突的功能。再次感谢!这是一个很好的解决方法,但它确实使代码的组织变得更加麻烦(例如,使用CI/CD管道)。我仍然想知道为什么会发生这种情况。