Lambda 托管实例的 Python 运行时 - AWS Lambda

Lambda 托管实例的 Python 运行时

Lambda 运行时使用多个 Python 进程来处理并发请求。每个并发请求都在单独的进程中运行,且拥有自己的内存空间和初始化环境。每个进程一次只处理一个请求,并且同步进行。进程之间不会直接共享内存,因此全局变量、模块级别的缓存以及单例对象会在并发请求之间保持独立。

并发配置

Lambda 向每个执行环境发送的最大并发请求数由函数配置中的 PerExecutionEnvironmentMaxConcurrency 设置控制。这是一项可选设置,其默认值因运行时而异。对于 Python 运行时而言,其默认设置为每个 vCPU 16 个并发请求,或者您也可以自行配置其他数值。该值还决定了 Python 运行时所使用的进程数量。Lambda 会根据每个执行环境吸收这些请求的容量,自动调整并发请求的数量,最高到配置的最大值。

重要

使用基于进程的并发意味着每个运行时工作进程都会自行进行初始化操作。总内存使用量等于每个进程的内存占用量乘以并发进程的数量。如果您正在加载大型库或数据集,并且具有高并发数,则您将会占用大量内存。根据您的工作负载,您可能需要调整 CPU 与内存的比例,或者降低并发设置,以避免超出可用内存的容量。您可以在 CloudWatch 中使用 MemoryUtilization 指标来跟踪内存消耗情况。

为多并发构建函数

由于采用了基于进程的多并发模型,使用 Python 运行时的 Lambda 托管实例函数不会从多个调用中同时访问内存中的资源。您无需为了内存中的并发安全来应用编码实践。

共享的 /tmp 目录

/tmp 目录在执行环境中为所有并发请求共享使用。对同一个文件进行并发写入可能会导致数据损坏,例如,如果另一个进程覆盖了该文件。要解决这个问题,要么为共享文件实施文件锁定机制,要么根据每个进程或每次请求使用唯一的文件名以避免冲突。记得清理不再需要的文件,以免耗尽可用空间。

日志记录

在多并发系统中,日志交错(即来自不同请求的日志条目在日志中交错排列)是常见现象。

使用 Lambda 托管实例的函数始终使用高级日志记录控制引入的结构化 JSON 日志格式。此格式包括 requestId,使得日志条目能够与单个请求相关联。当您在 Lambda 中使用 Python 标准库中的 logging 模块时,requestId 会自动包含在每个日志条目中。有关更多信息,请参阅将 Lambda 高级日志记录控制与 Python 结合使用

请求上下文

使用 context.aws_request_id 访问当前请求的请求 ID。

使用 Python 运行时,您可以通过 _X_AMZN_TRACE_ID 环境变量来获取 Lambda 托管实例的 X-Ray 跟踪 ID。使用 AWS SDK 时,X-Ray 跟踪 ID 会自动传播。

初始化和关闭

函数初始化会在每个进程中发生一次。如果您的函数在初始化过程中发出日志,您可能会看到重复的日志条目。

对于带有扩展程序的 Lambda 函数,其执行环境在关闭时会发出一个 SIGTERM 信号。扩展程序使用此信号来触发清理任务,例如刷新缓冲区。您可以订阅 SIGTERM 事件来触发函数清理任务,例如关闭数据库连接。要了解有关执行环境生命周期的更多信息,请参阅了解 Lambda 执行环境生命周期

依赖项版本

Lambda 托管实例需要以下最低程序包版本:

  • 适用于 AWS Lambda 的 Powertools(Python):版本 3.23.0 或更高版本

Powertools for AWS Lambda (Python)

适用于 AWS Lambda 的 Powertools(Python)与 Lambda 托管实例兼容,并提供用于日志记录、跟踪、指标等的实用工具。有关更多信息,请参阅适用于 AWS Lambda 的 Powertools(Python)

后续步骤