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

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

概述

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

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

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

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

与绑定到无服务器云函数的高级特性相同,无服务器云函数例程特性也使用 Python 高级特性装饰器实现,这意味着开发者可以以更简洁、美观的代码快速集成该特性。什么是 Python 装饰器?

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

指导

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

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

无服务器云函数

创建函数

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

编写代码

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

from tencent.cloud.serverless import functions

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

dispatcher = functions.use_routine_dispatcher()

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

然后我们需要编写 2 个例程,分别是 addendsubtract,分别对应加法和减法的算术运算:

@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 的无服务器云函数,并分别实现适用于加法和减法算术运算的无服务器云函数例程,现在让我们在一个本地函数中调用它们:

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

from tencent.cloud.serverless import functions

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

function_client = functions.fetch_client()

然后,我们需要为无服务器云函数的 addendsubtract 分别创建 2 个 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

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

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

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

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

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

现在,变量 addendsubtract 为可调用的 Python 原生函数对象。

调用例程

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

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

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

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

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

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

打印输出

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

30
10

最后更新于