> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chaintable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 工作原理

> 理解 Notebook 的运行环境、实例生命周期，以及驱动脚本如何协调计算任务。

Notebook 保存 Python 驱动脚本和参数定义。启动一次运行，会根据当时的代码、参数和资源配置创建一个实例。脚本在实例中决定何时计算、处理哪些输入、等待哪些依赖，以及如何处理结果。

实例与脚本提交的远程计算任务各自有独立的生命周期。理解这层关系，有助于选择资源、安排持续运行，并判断停止或重启后的数据状态。

## 运行环境

每个 Notebook 实例在独立沙箱中运行。沙箱提供隔离的执行环境，并按启动时的配置限制 CPU 和内存使用。环境预装 Chaintable SDK，脚本可以通过它们读取表、查询链上状态或提交计算。

Notebook 的资源配置用于驱动脚本本身的工作，例如整理输入和收集结果。提交给 BlockX 的函数使用独立的计算资源，增加 Notebook CPU 不会直接增加函数的调用预算。Notebook 与 Function 支持的接口也可能不同，计算函数应按[运行环境与访问边界](/zh/guides/functions/model#运行环境与访问边界)中的说明编写。

## 实例生命周期

启动时，系统检查账户额度，并将代码、参数和资源配置保存到本次实例。运行中的标准输出、错误日志和资源用量可以在网页查看。脚本正常返回、抛出未处理异常、被停止、达到期限或因内存不足被终止后，实例结束。

修改 Notebook 不会改写已经启动的实例。要使用新代码，需要启动新的实例；调度的后续运行使用已保存的脚本。

前台运行需要保持页面活动；切换后台后，脚本可以在离开页面后继续执行，但仍受运行期限限制。需要自动创建后续实例时，使用定时调度或 **Continuous** 调度，配置方法见[调度](/zh/guides/notebooks/scheduling)。

Continuous 在实例退出后创建新的实例，从脚本入口重新执行。Python 变量、内存缓存和循环位置不会随之恢复。需要保留的结果和处理进度应写入持久存储；多次运行共用的配置可以使用账户的[运行变量](/zh/guides/notebooks/advanced#读取运行变量)。

## 驱动脚本如何协调计算

在脚本中直接调用一个普通 Python 函数，会在当前实例内执行。通过 BlockX SDK 或 Pipeline 提交计算任务时，函数在独立的计算环境中运行，Notebook 等待或收集任务结果。

计算函数应通过参数接收数据，并自行导入所需依赖。Notebook 中的全局变量和已创建的客户端不会自动成为计算函数的可用状态。

以一个区块数据 Pipeline 为例，驱动过程如下：

1. **确定可处理范围。** 脚本读取触发源和依赖表的处理进度，将计算范围限制在数据已准备好的区块内。
2. **找出目标表缺口。** 历史回填根据目标表的已处理区间，选择尚未完成的区块。
3. **提交计算任务。** 任务根据源记录生成函数输入，BlockX 并行执行各次调用，脚本等待或收集任务状态。
4. **写入并记录进度。** 结果处理器将返回记录写入目标表，BlockDB 同时维护该表的区块覆盖。没有匹配记录的已处理区块也需要留下进度。
5. **持续追踪新数据。** 持续更新在补齐缺口后订阅后续变化，再重复上述过程。

这里需要区分依赖关系和执行资源：Notebook 决定何时满足提交条件，BlockX 负责函数执行，BlockDB 记录数据与完成进度。声明依赖能避免在源数据尚未齐全时提前计算；把进度存入目标表，则让后续实例能够根据已完成范围继续工作。具体配置见[构建 Pipeline](/zh/guides/notebooks/build-pipeline)。

## 停止与重新运行

停止 Notebook 会结束驱动实例，但不代表已提交的计算任务也已终止，已经完成的写入也不会因此回滚。判断处理到哪里，应结合任务结果、目标表的区块覆盖和异步写任务状态，不能只看 Notebook 是否已停止。

重新运行脚本时，应从已保存的处理进度决定下一批输入。使用 Pipeline 回填可利用目标表覆盖信息跳过已完成区块；自行提交任务时，需要自行处理重复输入和重试，避免将实例重启误当成从某一行代码继续执行。
