AWS Lambda 函数中的单例实例生命周期 (Python)

Ars*_*jum 2 python aws-lambda

如果我在 Lambda 中创建一个单例实例,并将 lambda 超时设置为 30 秒。下次调用时,如果使用相同的容器,我会获得相同的单例实例还是新的单例实例。我正在 lambda 处理程序中创建这个单例,并且使用 python。

小智 5

AWS Lambda 通过启动容器来处理请求。如果一个新的请求到达并且没有容器是空闲的,那么它会启动一个新的容器来执行这个请求。但是,如果存在当前未处理任何请求的容器,则新请求将被路由到此容器。

所以基本上如果使用相同的容器,您将获得相同的单例实例。但是,如果使用新容器来处理请求,您将获得一个新的单例实例。

您可以使用以下代码轻松测试它。这个 lambda 是从带有代理的 api 网关调用的,并且名称作为带有 GET 请求的查询参数发送。添加了 20 秒的延迟,以便多个执行可以在不同的容器中运行。

import json
import time

class Singleton:

   __instance = None

   @staticmethod 
   def getInstance(name):
      """ Static access method. """
      if Singleton.__instance == None:
         Singleton(name)

      print(Singleton.__instance.name)

      return Singleton.__instance


   def __init__(self,name):
      """ Virtually private constructor. """
      if Singleton.__instance != None:
         raise Exception("This class is a singleton!")
      else:
         self.name = name
         Singleton.__instance = self



def lambda_handler(event, context):
    # TODO implement

    param = event.get("queryStringParameters")
    s = Singleton.getInstance(param.get("name"))

    time.sleep(20)

    return {
        'statusCode': 200,
        'body': json.dumps(s.name)
    }
Run Code Online (Sandbox Code Playgroud)