Azure上python函数应用中的全局变量。

问题描述 投票:0回答:1

我有一个 Azure 函数应用,其中我需要在几个 python 函数中使用当前的日期时间(-3 小时)。

为了确保每个函数都使用相同的时间,我在函数定义之前全局生成datetime对象,并在函数中使用它。

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 变量为上传的日期时间,并且在随后的所有执行过程中固定不变(timerTrigger)。例如,我昨天上传了我的函数,此后命令 logging.warning(current_time)main() 产出 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上的一个错误吗?或者最好的解决方法是什么?它是否与(im)mutable类型有关,如果是,有谁能提供一个链接来解释这种情况(我知道类函数参数的行为)?

我想把它全局定义为 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 global-variables azure-function-app
1个回答
0
投票

有一个类似的问题,使用一个 Python定时器触发的Azure函数.

I 使用一个全局变量来保存时间戳。 这将被用来创建我上传的blob的文件夹结构,例如。/year/month/day/hour.

I 注意到初始调用后,值保持不变。 的意思是,如果函数在第二天被触发,全局时间戳似乎仍然保持相同的值。注意到这一点是因为函数将文件写入了错误的blobstorage文件夹。

对我来说 看起来这些全局变量只被初始化一次,然后就永远存在了。. 因此,Azure 函数运行时从未真正 "关闭 "和重启过。__init__.py 它只是触发了主功能。

之前我使用HTTP触发器,然后我没有这个问题。因此,在我的情况下,这似乎只是计时器触发的Azure函数的一个问题。

也许对Azure Runtime有更深入了解的人可以更详细地解释这种行为,以及为什么会发生这种情况?

© www.soinside.com 2019 - 2024. All rights reserved.