Жизненный цикл экземпляра Singleton в AWS лямбда-функции (Python) - PullRequest
1 голос
/ 10 января 2020

Если я создаю одноэлементный экземпляр в Lambda и устанавливаю время ожидания лямбда на 30 с. При следующем вызове я получу тот же экземпляр или новый экземпляр, если используется тот же контейнер. Я создаю этот синглтон внутри лямбда-обработчика и использую python.

1 Ответ

1 голос
/ 11 января 2020

AWS 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)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...