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

Ars*_*jum 2 python sqlalchemy aws-lambda

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

为了测试该会话仍然存在,我使用了以下步骤:

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

现在我调用了 lambda,并在 lambda 中对同一个表运行选择查询。

由于在 postgres 中 select 和 drop 不能同时运行,所以现在您可以检查 select 语句正在等待 drop 查询获取的锁。

San*_*Kim 6

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

当aLambda超时甚至正常结束后,并发会存活一段时间(可能10~30min)。这意味着内存区域仍然被保留。它是为了对连续调用做出快速反应,因为启动并发需要时间。

因此,如果请求另一次调用,则将在同一内存区域中重用并发性。

这就是为什么您的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
.
.
.
Run Code Online (Sandbox Code Playgroud)
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
.
.
Run Code Online (Sandbox Code Playgroud)

此外,您可以检查现在正在运行的并发数CloudWatch