为什么即使lambda超时,sqlalchemy会话仍保持打开状态

时间:2020-01-16 14:39:54

标签: python sqlalchemy aws-lambda

我正在AWS Lambda上测试SQL Alchemy。引擎和会话处于单例状态。根据观察到的行为,我的问题是为什么即使在Lambda超时后,SQL Alchemy会话仍在AWS Lambda中仍然存在。

要测试会话是否仍然存在,我使用了以下步骤:

使用postgres作为数据库时,我启动了一个事务并运行了drop查询,但是没有提交也没有回滚它。在工作台J中做了这个。

现在我调用了lambda,在lambda中,我在同一张表上运行了select查询。

与postgres中的select和drop不能同时运行一样,因此现在您可以检查select语句正在等待drop查询获取的锁。

1 个答案:

答案 0 :(得分:3)

调用Lambda函数时,将创建一个Lambda并发。 您可以将并发视为容器。

Lambda超时甚至正常完成后,并发将保留一段时间(可能10到30分钟)。这意味着该存储区域也仍然保留。这是为了对连续调用做出快速反应,因为启动并发需要一段时间。

因此,如果请求再次调用,则并发将在相同的内存区域中重新使用。

这就是为什么您的sqlalchemy会话在下一次调用时仍然有效。

但是,如果在一个并发运行时请求另一次调用,则会创建另一个并发而不共享内存区域。那时,您的sqlalchemy会话不存在。

您可以查看一个小例子。 以1秒的间隔分别调用Lambda函数10次,然后检查输出。两种功能将显示不同的结果。

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中查看正在运行多少并发。