Почему сеанс sqlalchemy остается открытым, даже если лямбда-тайм-аут - PullRequest
0 голосов
/ 16 января 2020

Я тестирую SQL Алхимия на AWS Лямбда. Двигатель и сессия в одноместном варианте. Согласно наблюдаемому поведению, мой вопрос состоит в том, почему в AWS Lambda, SQL сеанс алхимии остается там даже после того, как Lambda истекает.

Чтобы проверить, что сеанс остается там, я использовал следующие шаги:

С postgres в качестве db я запустил транзакцию и выполнил запрос на удаление, но не зафиксировал и не откатил ее. Сделал это в верстаке.

Теперь я вызвал лямбду и в лямбде я запускаю запрос на выборку для той же таблицы.

Как и в postgres, выбор и отбрасывание не могут выполняться одновременно, поэтому теперь вы можете проверить, что оператор выбора ожидает для блокировки, полученной по запросу drop.

1 Ответ

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

Когда вызывается функция Lambda, создается один Lambda параллелизм. Вы можете думать о параллелизме как о контейнере.

После того, как время Lambda истекло или даже закончилось нормально, параллелизм некоторое время будет жив (возможно, 10 ~ 30 мин). Это означает, что область памяти также все еще сохраняется. Он должен быстро реагировать на непрерывный вызов, потому что загрузка параллелизма занимает время.

Таким образом, если запрашивается другой вызов, параллелизм повторно используется с той же областью памяти.

Вот почему ваш sqlalchemy сеанс все еще активен при следующем вызове.

Однако, если во время выполнения одного параллельного вызова запрашивается другой вызов, создается другой параллелизм, не разделяющий область памяти. В это время ваш sqlalchemy сеанс отсутствует.

Вы можете проверить на небольшом примере. Вызовите функцию Lambda 10 раз с интервалом 1 сек c соответственно и проверьте вывод. Две функции будут показывать разные результаты.

variable = 10

def lambda_function(event, context):
    global variable
    print(variable)  
    variable += 1

# output: the variable increase because it reuse memory.
10
11
12
13
14
.
.
.

import time

variable = 10

def lambda_function(event, context):
    global variable
    print(variable)  
    variable += 1
    time.sleep(60)  # Lambda timeout also should be long enough

# output: the variable doesn't increase because new concurrency is used while previous concurrencies are pending at sleep(60)
10
10
10
10
.
.

Кроме того, вы можете проверить, сколько одновременных операций выполняется в CloudWatch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...