为了加快 Lambda 执行速度,我尝试将 Python 代码的某些部分移到处理函数之外
As per Lambda 的文档 https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html:
执行 Lambda 函数后,AWS Lambda 会维护
执行上下文一段时间以等待另一个 Lambda
函数调用。实际上,服务冻结了执行
Lambda 函数完成后的上下文,并解冻上下文
重用,如果 AWS Lambda 在 Lambda 执行时选择重用上下文
函数被再次调用。这种执行上下文重用方法有
以下含义:
Lambda 函数中的任何声明
代码(处理程序代码之外,请参阅编程模型)仍然存在
初始化,在函数运行时提供额外的优化
再次调用。例如,如果您的 Lambda 函数建立了
数据库连接,而不是重新建立连接,
原始连接将在后续调用中使用...
按照他们的示例,我已将数据库连接逻辑移至处理程序函数之外,以便后续WARM该函数的运行可以重用该连接,而不是每次该函数执行时都创建一个新连接。
但是,AWS Lambda 不保证启动的函数的所有后续调用COLD将会运行得很热,所以如果 Lambda 决定COLD启动是必要的,我的代码将重新创建数据库连接。
当这种情况发生时,我假设之前的(WARM) Lambda 拆除的函数实例将与数据库建立一个活动连接,该连接从未关闭,如果该模式不断重复,我怀疑我会有很多孤立的数据库连接。
Python 有没有办法检测 Lambda 是否试图杀死我的函数实例(也许它们发送 SIGTERM 信号?)并让它关闭活动的数据库连接?
我使用的数据库是Postgres。
接受的答案不再正确,它可能是过去的,但今天你的 lambda 应该收到一个SIGTERM
当 AWS 打算终止时。
AWS 在此处提供了有关处理 Python 和其他语言的正常关闭的官方示例:
https://github.com/aws-samples/graceful-shutdown-with-aws-lambda/tree/main/python-demo https://github.com/aws-samples/graceful-shutdown-with-aws-lambda/tree/main/python-demo
但实际上你这样做:
import signal
def exit_gracefully(signum, frame):
print('SIGTERM RECEIVED')
signal.signal(signal.SIGTERM, exit_gracefully)
这会在容器关闭时调用,并且您有 300 毫秒的时间进行清理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)