Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的python定时器触发器函数没有在正确的时间运行?_Python_Azure_Azure Functions_Azure Functions Runtime_Azure Function App - Fatal编程技术网

为什么我的python定时器触发器函数没有在正确的时间运行?

为什么我的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分钟,所以我不知道它在哪里卡住了 成功时,它可以工

这可能是一个很难回答的问题。我有一个Azure函数,它可以响应HTTP请求,并且运行良好,我可以从浏览器或Python 3.8脚本调用它

我想创建另一个函数,该函数将具有
计时器触发器
,并将按计划调用
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管道)。我仍然想知道为什么会发生这种情况。