gpt4 book ai didi

python - Azure 上的 python 函数应用程序中的全局变量

转载 作者:行者123 更新时间:2023-12-03 02:41:10 25 4
gpt4 key购买 nike

我有一个 Azure 函数应用程序,其中需要多个 Python 函数中的当前日期时间(-3 小时)。

为了确保每个函数使用相同的时间,我在函数定义之前全局生成日期时间对象,并稍后在函数内使用它:

from datetime import datetime, timedelta
import pytz

# get the current time in the correct timezone. Since triggers are executed based on UTC, we then again subtract
# 3 hours (just to be save) to end up with the correct day
current_time = datetime.now(tz=pytz.timezone('Europe/Berlin'))
current_time -= timedelta(days=(3 / 24))

def _file_exists() -> bool:
filename = current_time.strftime('%Y-%m-%d.csv')
# ... further code


def main():
save_as = '{path}/{filename}'.format(path=path_raw, filename=filename)
# ... further code

我不需要修改内容,因此没有 global 关键字。

但是,当我将此函数发布到 azure(Python 3.8、Linux)时,它会解析脚本并将 current_time 变量设置为上传的日期时间,并且对于所有后续执行都是固定的(计时器触发)。例如,我昨天上传了我的函数,从那时起 main() 中的命令 logging.warning(current_time) 输出 2020-04-14 08:31 :05.003618+02:00

如果我在本地(Python 3.7、Windows、PyCharm)尝试此操作,即使我手动对文件进行字节编译,也可以正常工作:

python test.py    # 2020-04-15 11:30:36.426750+02:00
python test.py # 2020-04-15 11:31:00.439632+02:00

python -m compileall .
python __pycache__/test.pyc # 2020-04-15 11:33:27.189967+02:00
python __pycache__/test.pyc # 2020-04-15 11:33:36.853601+02:00

这是 azure 上的错误吗?和/或最好的解决方法是什么?它是否与(不)可变类型有关,如果是,有没有人提供一个链接来解释这种情况(我知道类/函数参数中的行为)?

我考虑将其全局定义为 None,并在脚本中调用的脚本中的 _init() 函数中设置该值。

编辑:经过几次不成功的尝试后我发现

# get the current time in the correct timezone. Since triggers are executed based on UTC, we then again subtract
# 3 hours (just to be save) to end up with the correct day
current_time = None


def _init_current_time():
global current_time
current_time = datetime.now(tz=pytz.timezone('Europe/Berlin')) - timedelta(days=(3 / 24))

def main():
_init_current_time()
# main code

完成这项工作。到目前为止,我可以使用它,只是感觉非常......肮脏。那么,继续这个问题,是否有适当的解决方案?

最佳答案

使用Python计时器触发的Azure函数遇到了类似的问题。

使用一个保存时间戳的全局变量,它将用于创建我上传的 blob 的文件夹结构,例如/年/月/日/时

注意到在首次调用该函数后这些值保持不变,这意味着如果第二天触发该函数,则全局时间戳似乎仍然保持相同的值。注意到这是因为该函数将文件写入了错误的 blobstorage 文件夹。

对我来说看起来这些全局变量只初始化一次,然后永远存在。因此,Azure Function Runtime 永远不会真正“关闭”并重新启动 __init__.py 它只是触发 main 函数。

在我使用 HTTP 触发器之前,我没有遇到此问题。因此,就我而言,这似乎只是计时器触发的 azure 函数的问题。

也许对 Azure 运行时有更深入了解的人可能会更详细地解释此行为以及为什么会发生?

关于python - Azure 上的 python 函数应用程序中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61228978/

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