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

2024-04-26 04:56:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

使用postgres作为db,我启动了一个事务并运行了drop查询,但没有提交也没有回滚它。这是在workbenchJ做的

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

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


Tags: lambda引擎awsdbsql步骤postgres语句
1条回答
网友
1楼 · 发布于 2024-04-26 04:56:51

调用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中现在运行的并发数

相关问题 更多 >