

# 适用于 Python 的 Lambda SnapStart 运行时钩子
<a name="snapstart-runtime-hooks-python"></a>

在 Lambda 创建快照之前或在 Lambda 从快照恢复函数之后，使用运行时钩子实施代码。Python 运行时钩子作为开源 [Python 库的快照还原](https://pypi.org/project/snapshot-restore-py/)（包含在 Python 托管式运行时中）的一部分提供。此库提供了两种可用于定义运行时钩子的修饰器：
+ `@register_before_snapshot`：适用于要在 Lambda 创建快照之前运行的函数。
+ `@register_after_restore`：适用于要在 Lambda 从快照恢复函数时运行的函数。

或者，您可以使用以下方法，注册运行时钩子的可调用对象：
+ `register_before_snapshot(func, *args, **kwargs)`
+ `register_after_restore(func, *args, **kwargs)`

## 运行时钩子注册和执行
<a name="runtime-hooks-registration-python"></a>

Lambda 执行运行时钩子的顺序由注册顺序决定：
+ 快照前：按注册的相反顺序执行
+ 快照后：按注册的顺序执行

运行时钩子注册的顺序取决于定义钩子的方式。使用装饰器（`@register_before_snapshot` 和 `@register_after_restore`）时，注册顺序遵循代码中导入、定义或执行的顺序。如果您需要对注册顺序有更多控制，则请使用 `register_before_snapshot()` 和 `register_after_restore()` 方法代替装饰器。

请确保所有注册的钩子都已正确导入，并包含在函数代码中。如果在单独的文件或模块中注册运行时钩子，则您必须确保将该模块直接导入或作为较大程序包的一部分导入到函数的处理程序文件中。如果未在函数处理程序中导入文件或模块，则 Lambda 会忽略运行时钩子。

**注意**  
Lambda 创建快照时，初始化代码最多可以运行 15 分钟。时间限制为 130 秒或[配置的函数超时](configuration-timeout.md)（最大 900 秒），以较高者为准。您的 `@register_before_snapshot` 运行时挂钩计入初始化代码时限。Lambda 还原快照时，运行时必须加载，并且 `@register_after_restore` 运行时钩子必须在超时限制（10 秒）内完成。否则，您将收到 SnapStartTimeoutException。

## 示例
<a name="runtime-hooks-python-code-sample"></a>

以下示例处理程序介绍如何在检查点检查（`@register_before_snapshot`）之前和还原（`@register_after_restore`）之后运行代码。

```
from snapshot_restore_py import register_before_snapshot, register_after_restore

def lambda_handler(event, context):
    # Handler code

@register_before_snapshot
def before_checkpoint():
    # Logic to be executed before taking snapshots

@register_after_restore
def after_restore():
    # Logic to be executed after restore
```

有关更多示例，请参阅 AWS GitHub 存储库中的 [Snapshot Restore for Python](https://github.com/aws/snapshot-restore-py/tree/main/examples)。