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 查询获取的锁。
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
。
归档时间: |
|
查看次数: |
1117 次 |
最近记录: |