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

Python 为什么sqlalchemy会话保持打开状态,即使lambda超时,python,sqlalchemy,aws-lambda,Python,Sqlalchemy,Aws Lambda,我正在AWS Lambda上测试SQL炼金术。引擎和会话在一个单例中。根据观察到的行为,我的问题是,为什么在AWS Lambda中,SQL炼金术会话即使在Lambda超时后仍然存在 为了测试会话是否仍然存在,我使用了以下步骤: 使用postgres作为db,我启动了一个事务并运行了drop查询,但没有提交也没有回滚它。这是在workbenchJ做的 现在我调用了lambda,并在lambda中对同一个表运行select查询 在postgres中,select和drop不能同时运行,因此现在可以检

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

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

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

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


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

调用
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
.
.
.


此外,您可以检查
CloudWatch

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


此外,您可以在
CloudWatch

中检查现在运行的并发数,您如何知道会话仍然存在?您是否从DB端查看会话?@9000问题已更新。您是否在处理程序函数之外创建连接?不完全在处理程序函数之外。我在handler函数中使用了一个单例类DbUtility。由于lambda的进程在执行之间不一定会关闭,因此单例类中的连接可能会保持。您如何知道会话仍然存在?您是否从DB端查看会话?@9000问题已更新。您是否在处理程序函数之外创建连接?不完全在处理程序函数之外。我在handler函数中使用了一个单例类DbUtility。由于lambda的进程在执行之间不一定关闭,因此单例类中的连接可能会持续。我如何复制这样的东西。有点像一个不使用sqlalchemy@ArslanAnjum我添加了一个简单的例子来帮助您理解。我如何复制这样的东西。有点像一个不使用sqlalchemy@ArslanAnjum我添加一个简单的示例来帮助您理解。