AWS Lambda 中 Python 全局变量的范围

wrs*_*der 12 python amazon-web-services aws-lambda

AWS Lambda 中全局变量的范围或生命周期是多少?

例如,如果我这样做:

cache = {}

def lambda_handler(event, context):
   # do something with "cache"
   # do something else with "cache"
Run Code Online (Sandbox Code Playgroud)

cache每次调用都会初始化一次(每次 Lambda 执行都有新的进程),还是一旦初始化此模块,它是否会重新用于多次调用?

小智 12

全局变量在同一执行环境中的调用之间保留其值。

库应该在处理程序外部的初始化代码中定义,以便在创建执行环境时加载它们一次。

AWS

import boto3, json

client = boto3.resource('dynamodb', region_name='eu-west-1')
tbl = client.Table('my-dynamo-table')

mydata = {}
mydata["groups"] = []

def lambda_handler(event, context):
    if len(mydata["groups"]) == 0:
        # data is not cached, make call to dynamo
        data = tbl.scan()
        group_data = data['Items']

        for group in group_data:
            mydata["groups"].append(group['name'])
        return mydata

    else:
        # return cached content
        return mydata
Run Code Online (Sandbox Code Playgroud)

利用执行环境重用来提高函数的性能。在函数处理程序之外初始化 SDK 客户端和数据库连接,并将静态资源本地缓存在 /tmp 目录中。由同一函数实例处理的后续调用可以重用这些资源。这通过减少函数运行时间来节省成本。

AWS

  • 我希望每次调用都有全局变量,并且不想在任何并行调用之间共享我的“缓存”对象。是否可以 ? (2认同)

Sov*_*sra 5

Lambda 全局变量不会在每次调用时更新。您在处理函数中编写的任何内容都将在每次调用时被调用。

谈到全局变量的生命周期,只要初始化的容器保持运行状态(如果容器在一段时间内保持不活动状态,它就会关闭容器)或者代码被修改和重新部署,它就会一直存在。我们应该谨慎对待缓存的内容,即如果缓存的数据经常更新,那么将其存储在缓存中并不是一个好主意。

https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html

https://medium.com/tensult/aws-lambda-function-issues-with-global-variables-eb5785d4b876