我正在AWS Lambda上测试SQL Alchemy。引擎和会话处于单例状态。根据观察到的行为,我的问题是为什么即使在Lambda超时后,SQL Alchemy会话仍在AWS Lambda中仍然存在。
要测试会话是否仍然存在,我使用了以下步骤:
使用postgres作为数据库时,我启动了一个事务并运行了drop查询,但是没有提交也没有回滚它。在工作台J中做了这个。
现在我调用了lambda,在lambda中,我在同一张表上运行了select查询。
与postgres中的select和drop不能同时运行一样,因此现在您可以检查select语句正在等待drop查询获取的锁。
答案 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
中查看正在运行多少并发。