
# AimRT 接口概述


本文档介绍使用 AimRT 接口时的一些基本须知。

## AimRT 接口界面总览

AimRT 为多种开发、应用场景提供了界面，总体来说包括以下方面：
- **模块逻辑开发接口**：用于开发具体的业务模块，包含 C、CPP、Python 接口，其中 CPP 接口是基于 C 接口封装的，Python 接口是基于 CPP 接口封装的；
- **实例部署运行接口**：主要用于 APP 模式下部署运行，包含 CPP、Python 接口，其中Python 接口是基于 CPP 接口封装的；
- **实例运行配置**：AimRT 运行时配置，Yaml 形式；
- **插件开发接口**：用于开发 AimRT 插件，仅提供 CPP 接口；



在 AimRT 中，一个重要是思想是将**逻辑实现**与实际**部署运行**分离。用户在开发业务逻辑时不需要关心最后部署运行的方式，在最终部署运行时发生的一些变化也不需要修改业务逻辑代码。

例如，当用户在编写一个 RPC Client 和 Server 端逻辑时，只需要知道 Client 发起的请求 Server 端一定会收到，而不需要关心 Client 端和 Server 端会部署在哪，也不用关心实际运行时底层数据会通过什么方式通信。等到部署时，使用者才需要决定 Client 端和 Server 是部署在端上还是云上/是部署在一台物理节点还是多台物理节点上，然后再根据部署情况选择合适的底层通信方式，例如是共享内存通信还是通过网络通信。

因此，对应与这套设计思想，AimRT中广义的接口分为两大部分：
- 用户在开发**业务逻辑**时所需要知晓的接口，例如如何记录日志、如何调用 RPC 等：
- 用户在**部署运行**时所需要知晓的接口/配置，例如如何集成模块、如何选定底层通信方式等。注意：这里所需要关心的不仅包括基于 C++/Python 等语言的代码形式的接口，也包括配置文件的配置项：


## AimRT 接口兼容性策略

AimRT 针对几方面的接口，目前的兼容策略如下：
- **模块逻辑开发接口（ C、CPP、Python ）**：在 v1.0.0 正式版本发布之后，在每个主版本内，将保证严格的 API 接口兼容性。
- **实例部署运行接口**：
  - **Python**：在 v1.0.0 正式版本发布之后，在每个主版本内，将保证严格的 API 接口兼容性。
  - **CPP**：在 v1.0.0 正式版本发布之后，在每个主版本内，对于部分接口，将保证严格的 API 接口兼容性，具体请参考每个接口的注释。
- **实例运行配置（ Yaml ）**：在 v1.0.0 正式版本发布之后，在每个主版本内，将保证严格的配置兼容性。
- **插件开发接口（ CPP ）**：在 v1.0.0 正式版本发布之后，在每个主版本内，对于部分接口，将保证严格的 API 接口兼容性，具体请参考每个接口的注释。此部分与**实例部署运行接口（ CPP ）** 的策略一致。



## C接口、C++接口与Python接口

AimRT 目前支持 C、C++、Python三种语言的接口。但总体来说，C 接口主要用于模块逻辑开发时的 ABI 稳定问题，主要的开发语言还是 C++ 和 Python 两种。AimRT 对两者都提供了完善的文档，并且无论是用 C++ 或 Python 接口编写的程序，配置文件都是通用的。


AimRT 中，CPP 接口更全面、性能也更好，Python 接口则是基于 pybind11 对 CPP 接口的封装，并且并没有完全支持所有功能，性能上也会差一些。使用者需要根据实际场景选择合适的开发语言和接口。


## AimRT运行时生命周期

AimRT 框架在运行时依次有三大阶段：**Initialize**、**Start**、**Shutdown**。这三个阶段的意义以及对应阶段做的事情如下：
- **Initialize阶段**：
  - 初始化 AimRT 框架；
  - 初步初始化业务，申请好业务所需的 AimRT 框架中的资源；
  - 在主线程中依次完成所有的初始化，不会开业务线程，所有代码是线程安全的；
  - 部分接口或资源不能在此阶段使用，只能等到**Start**阶段使用；
- **Start阶段**：
  - 完全初始化业务；
  - 启动业务相关逻辑；
  - 可以开始使用 AimRT 中的所有资源，如发起 RPC、将任务投递到线程池等；
  - 在主线程中依次启动各个业务，业务可以再调度到多线程环境中；
  - 部分接口只能在**Initialize阶段**调用，不能在此阶段调用；
- **Shutdown阶段**：
  - 通常由 ctrl-c 等信号触发；
  - 优雅停止业务；
  - 优雅停止 AimRT 框架；
  - 在主线程中阻塞的等待所有业务逻辑结束；
  - 大部分接口在此阶段都无法继续使用；

简而言之，一些申请 AimRT 资源的操作，只能在 **Initialize** 阶段去做，以此来保证在业务运行期间AimRT框架不会有新的资源申请或者锁操作，保证 **Start** 阶段的效率和稳定性。

但是要注意，这里的 **Initialize** 阶段只是指AimRT的初始化，一些业务的初始化可能需要调用 AimRT 框架在 **Start** 阶段才开放的一些接口才能完成。因此业务的初始化可能要在 AimRT 框架 **Start** 阶段后才能完成，不能和 AimRT 框架的 **Initialize** 混为一谈。

