---
description: >-
  本文将向您进一步介绍并演示借助 Tencent Cloud SDK for Python
  如何为无服务器云函数创建多个例程并调用它们，这是绑定到无服务器云函数的进阶。
---

# 使用例程组织无服务器云函数

## 概述

这是由 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性，如果您未曾阅读如何将一个无服务器云函数绑定到 Python 原生同步或异步函数的实践文档，请先阅读：

{% content-ref url="bind-callable" %}
[bind-callable](bind-callable)
{% endcontent-ref %}

在上一篇最佳实践中我们得知借助 Tencent Cloud SDK for Python 可以快速实现将一个或多个 Python 原生的同步或异步函数绑定到指定的无服务器云函数，进而以完全 Python 原生调用的形态组织代码以屏蔽或减少开发者对无服务器云函数调用时的 RPC 流程感知。

遗憾的是，该高级特性仅适用于无服务器云函数调用方，而被调用的无服务器云函数依旧需要以传统事件处理的方式组织一个或多个功能的代码实现。当我们在一个无服务器云函数中提供的相关功能较多时，开发者还需要在无服务器云函数执行方法中实现事件解析和派发。

因此，Tencent Cloud SDK for Python 通过提供另外一种高级特性以解决这些问题，我们将其称之为适用于无服务器云函数集成调用的例程派发框架，简称无服务器云函数例程。

与绑定到无服务器云函数的高级特性相同，无服务器云函数例程特性也使用 Python 高级特性装饰器实现，这意味着开发者可以以更简洁、美观的代码快速集成该特性。[什么是 Python 装饰器？](https://docs.python.org/zh-cn/3/glossary.html#term-decorator)

没有理解？没关系，在下文中我们将通过几个简单的应用场景向您进一步说明如何使用无服务器云函数例程特性组成您的应用程序代码逻辑。

## 指导

在下文中我们将列举几段连续的示例代码并向您介绍 Tencent Cloud SDK for Python 所提供的无服务器云函数例程特性的工作流程。

假定我们需要在一个无服务器云函数中实现对加法和减法的算术运算：

### 无服务器云函数

#### 创建函数

首先我们需要创建一个名为 `arithmetic` 的无服务器云函数：

| 属性   | 值           |
| ---- | ----------- |
| 数据中心 | ap-shanghai |
| 命名空间 | default     |
| 函数名称 | arithmetic  |
| 运行环境 | Python 3.6  |

#### 编写代码

然后，我们需要为无服务器云函数 arithmetic 编写代码。与以往不同，我们将使用 Tencent Cloud SDK for Python 提供的无服务器云函数例程特性和框架。首先我们需要导入使用的命名空间和模块：

```python
from tencent.cloud.serverless import functions
```

接着我们需要调用 `use_routine_dispatcher` 函数为当前无服务器云函数启用例程派发器框架：

```python
dispatcher = functions.use_routine_dispatcher()
```

在上述代码中，我们得到一个被称之为例程派发器类型的实例并由变量 `dispatcher` 存储。例程派发器实际上是一个可解析无服务器云函数例程调用协议的路由，每一个例程派发器实例将管理一个或多个已注册的无服务器云函数例程。没有理解？没关系，让我们继续向下阅读。

然后我们需要编写 2 个例程，分别是 `addend` 和 `subtract`，分别对应加法和减法的算术运算：

```python
@dispatcher.routine
def addend(
    value1: int,
    value2: int
) -> int:
    return value1 + value2

@dispatcher.routine
def subtract(
    value1: int,
    value2: int
) -> int:
    return value1 - value2
```

或许您已经注意到，无服务器云函数例程实际上是一个套用例程派发装饰器的一个 Python 原生函数，在上述代码中我们仅需要为 Python 原生函数使用 `@dispatcher.routine` 装饰器即可将其注册为可调用的无服务器云函数例程。

到此，无服务器云函数 `arithmetic` 的代码已完成编写。

### 本地函数

#### 编写代码

在上文中我们已经创建名为 `arithmetic` 的无服务器云函数，并分别实现适用于加法和减法算术运算的无服务器云函数例程，现在让我们在一个本地函数中调用它们：

首先，我们需要导入所依赖的命名空间和模块：

```python
from tencent.cloud.serverless import functions
```

接着，我们需要在本地函数的 Python 模块全局获取一个无服务器云函数产品客户端实例：

```python
function_client = functions.fetch_client()
```

然后，我们需要为无服务器云函数的 `addend` 和 `subtract` 分别创建 2 个 Python 原生函数，并将他们分别绑定到对应的无服务器云函数例程：

```python
@function_client.bind_routine('ap-shanghai', 'default', 'arithmetic')
def addend(
    value1: int,
    value2: int
) -> int:
    raise NotImplementedError

@function_client.bind_routine('ap-shanghai', 'default', 'arithmetic')
def subtract(
    value1: int,
    value2: int
) -> int:
    raise NotImplementedError
```

是的，对无服务器云函数例程的绑定与对无服务器云函数的绑定非常相似。

{% content-ref url="../../../python-docs/serverless-functions/class-and-method/client/bind-routine" %}
[bind-routine](../../../python-docs/serverless-functions/class-and-method/client/bind-routine)
{% endcontent-ref %}

我们仅需要定义 2 个与无服务器云函数例程签名完全一致的 Python 原生函数，然后为其分别套用 `@function_client.bind_routine` 装饰器即可。现在对 Python 原生函数 `addend` 和 `subtract` 的调用等同于对无服务器云函数 `arithmetic` 的例程 `addend` 和 `subtract` 的调用。

值得注意的是，我们将这些与无服务器云函数例程签名相同的 Python 函数称之为 Python 原生扮演函数。

当然，如果您不希望在应用程序中为每一个无服务器云函数例程编写对应的 Python 原生函数，您可以选择由 Tencent Cloud SDK for Python 代您创建一个与指定无服务器云函数例程相关联的 Python 原生函数：

```python
addend = function_client.seletc_routine('ap-shanghai', 'default',
    'arithmetic', 'addend')
    
subtract = function_client.seletc_routine('ap-shanghai', 'default',
    'arithmetic', 'subtract')
```

{% content-ref url="../../../python-docs/serverless-functions/class-and-method/client/select-routine" %}
[select-routine](../../../python-docs/serverless-functions/class-and-method/client/select-routine)
{% endcontent-ref %}

现在，变量 `addend` 和 `subtract` 为可调用的 Python 原生函数对象。

#### 调用例程

最后，我们尝试在本地函数中调用无服务器云函数 `arithmetic` 的例程 `addend` 和 `subtract`，并打印输出加法和减法算术运算的结果：

```python
print(addend(10, 20))
print(subtract(30, 20))
```

请注意，如果您使用方法 `seletc_routine` 创建无服务器云函数例程的 Python 原生扮演函数，您需要完全使用关键字参数调用，否则 Tencent Cloud SDK for Python 无法确定每个参数对应的位置：

```python
print(addend(
    value1 = 10,
    value2 = 20
))

print(subtract(
    value1 = 30,
    value2 = 20
))
```

如果您希望在调用无服务器云函数例程时获得 RPC 流程感知，您可以使用方法 `routine_invoke` ：

{% content-ref url="../../../python-docs/serverless-functions/class-and-method/client/routine-invoke" %}
[routine-invoke](../../../python-docs/serverless-functions/class-and-method/client/routine-invoke)
{% endcontent-ref %}

#### 打印输出

如果一切正常，您将会在终端看到如下输出：

```
30
10
```
