AWS Lambda冷启动单次执行初始化代码放置位置及预置并发适配方法
冷启动阶段单次执行初始化逻辑的实现
Lambda Python运行时的执行生命周期原生支持冷启动单次执行逻辑:所有写在lambda_handler外的全局作用域代码,只会在实例冷启动的INIT阶段执行一次。实例初始化完成后会被Lambda冻结,后续热启动触发请求时会直接解冻运行handler逻辑,不会重新执行全局域代码,不需要额外加复杂的状态判断,这是最稳定的实现方式。
示例代码:
import boto3 # 全局域的初始化逻辑仅冷启动执行一次 s3_client = boto3.client("s3") # 初始化SDK客户端 dynamodb_client = boto3.client("dynamodb") global_config = None large_model = None def _do_cold_start_init(): global global_config, large_model # 自定义初始化逻辑:拉取远程配置、加载模型、预热连接等 global_config = {"env": "prod", "timeout": 30} large_model = "模拟大模型加载结果" print("冷启动全局初始化完成") _do_cold_start_init() def lambda_handler(event, context): # 该部分逻辑每次触发请求都会执行 return { "statusCode": 200, "client_id": id(s3_client) # 热启动时该值和上次请求一致,可证明客户端被复用 }
注意事项:
- 不要把初始化逻辑写到handler函数内部,否则每次触发请求都会重复执行
- INIT阶段如果初始化代码抛出错误,实例会直接启动失败,不会进入handler处理逻辑
- 全局域初始化的耗时,在按需冷启动场景会计入请求的冷启动总延迟
仅在预置并发实例执行初始化逻辑的方案
Lambda在实例初始化阶段会注入固定环境变量AWS_LAMBDA_INITIALIZATION_TYPE,可直接通过该变量判断当前实例的启动类型:
- 值为
provisioned-concurrency:当前为预置并发实例 - 值为
on-demand:当前为普通按需启动实例
直接在全局域初始化逻辑中增加判断即可实现预置并发专属初始化,示例代码:
import os import boto3 # 通用初始化:所有冷启动实例都执行 common_client = boto3.client("s3") # 预置并发专属初始化标记 provision_init_done = False def _provision_only_init(): global provision_init_done # 放置仅预置并发需要执行的重逻辑:预热连接池、预加载超大模型、预热下游接口等 print("执行预置并发专属初始化") provision_init_done = True # 冷启动时判断启动类型,仅预置并发实例执行专属逻辑 if os.getenv("AWS_LAMBDA_INITIALIZATION_TYPE") == "provisioned-concurrency": _provision_only_init() def lambda_handler(event, context): return { "statusCode": 200, "is_provision_instance": provision_init_done }
注意事项:
- 该环境变量在INIT阶段就已完成注入,全局域读取完全可靠,不需要等到handler执行阶段再判断
- 预置并发实例的INIT流程是Lambda根据配置提前执行的,这部分初始化耗时不会占用实际用户请求的处理时间,适合放置资源占用高、耗时长的初始化逻辑
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

