本页将向您介绍并演示如何使用 Tencent Cloud SDK for Python 轻松实现无服务器云函数间调用
通常情况下,我们可能需要在一个无服务器云函数中依赖另一个或多个无服务器云函数。通过在无服务器云函数中集成并使用 Tencent Cloud SDK for Python,无服务器云函数间调用将非常易于实现。
在下文中我们将通过一个简单的应用场景向您进一步介绍并演示如何使用 Tencent Cloud SDK for Python 快速实现在无服务器云函数之间相互调用。
假定我们在数据中心 ap-shanghai
的命名空间 default
中拥有 2 个已创建就绪的无服务器云函数,其名称分别是 hello
和 addend
。这些无服务器云函数的配置如下:
配置项
值
运行环境
Python 3.6
内存上限
64 MBytes
入口函数
index.main
运行角色
QCS_SCFExcuteRole
在该场景中,我们要求在无服务器云函数 hello
中以友好且可供人类直接阅读的字符串返回一次加法运算的结果,其加法运算过程要求在无服务器云函数 addend
中实现。
在下文中,我们将通过几个步骤向您演示编写符合当前场景要求的代码示例:
addend
函数首先,我们需要先编写无服务器云函数 hello
的依赖函数 addend
的函数源代码:
在无服务器云函数 addend
中,我们尝试获取当前函数调用事件中的字段 value1
和 value2
的值,并将字段 value1
和 value2
的值相加后返回,期望相加值类型为整形。
hello
函数接着,我们需要编写依赖无服务器云函数 addend
的主函数 hello
的函数源代码:
首先我们需要在无服务器云函数 hello
中导入 Tencent Cloud SDK for Python 相关命名空间和模块:
接着我们需要为无服务器云函数 hello
编写入口函数。
在入口函数中我们将尝试使用 Tencent Cloud SDK for Python 所提供的无服务器云函数间调用功能调用无服务器云函数 addend
完成一次加法运算并获取结果:
在无服务器云函数 hello
中,我们尝试使用 Tencent Cloud SDK for Python 函数间调用功能调用无服务器云函数 addend
计算数值 10
和 20
的相加结果并以人类易读的描述性字符串返回。
如果无服务器云函数 addend
运行出错,则返回错误原因的描述性字符串。
请注意,无服务器云函数间调用仅支持已配置 运行角色 的无服务器云函数发起调用。
现在我们尝试运行无服务器云函数 hello
,如果一切正常其运行结果为:
在上文的演示代码中我们导入 Tencent Cloud SDK for Python 的无服务器云函数产品软件包,使用 functions.invoke
函数完成无服务器云函数之间相互调用的工作。
您或许已经注意到,无服务器云函数间调用的方式不需要您维护一个访问凭据和无服务器云函数产品客户端实例,这是因为 Tencent Cloud SDK for Python 的无服务器云函数间调用机制已代您维护一个有效的临时访问凭据和产品客户端实例。
当您初次使用 functions.invoke
或 functions.invoke_async
函数时,Tencent Cloud SDK for Python 会尝试在内部实例化一个无服务器云函数产品客户端并搜寻采用非持久环境凭据。
当无服务器云函数已配置具有有效访问权限的 运行角色 时,其函数在运行代码之前将自动申请并获得一个非持久性的临时访问凭据并将其存储在当前运行环境的环境变量中,这就是环境凭据的由来。
如果当前无服务器云函数已配置 运行角色,实例化通用或产品客户端时允许不提供访问凭据,此时 Tencent Cloud SDK for Python 将自动搜寻并采用环境凭据。
并且,函数 functions.invoke
或 functions.invoke_async
在内部将依赖无服务器云函数产品客户端的 easy_invoke
实例方法,其具有与依赖方法相同的行为和返回值。
请注意,使用无服务器云函数间调用方式调用的目标无服务器云函数必须与当前无服务器云函数所在数据中心相同,且命名空间为 default。
否则,您应该将参数 namespace_name 和 region_id 设置为有效值。
因此,无服务器云函数间调用机制并非真正地脱离无服务器云函数产品客户端,只是 Tencent Cloud SDK for Python 为开发者提供更佳便利的封装调用机制。
本文将向您介绍并演示借助 Tencent Cloud SDK for Python 如何实现本机定时调用无服务器云函数
谈论到定时调用无服务器云函数时,或许我们首先想到的是利用无服务器云函数的定时触发器功能来实现。当我们需要在大量不确定个数的指定时间调用无服务器云函数时定时触发器将不能为我们提供便利,因为无服务器云函数的触发器个数受触发器配额限制。
通过借助 Tencent Cloud SDK for Python 的无服务器云函数定时调用机制,我们可以快速在本机运行环境中实现在在多个指定时间调用指定的无服务器云函数并获得运行结果,这也称之为按时间计划调用。
在下文中我们将通过一个简单的应用场景向您进一步介绍并演示如何利用 Tencent Cloud SDK for Python 实现对指定无服务器云函数的本机定时调用。
假定我们在数据中心 ap-shanghai
的命名空间 default
拥有一个已创建就绪的无服务器云函数 hello
,其无服务器云函数的配置为:
配置
值
运行环境
Python 3.6
内存上限
64 MBytes
入口函数
index.main
运行角色
QCS_SCFExcuteRole
在该场景中我们要求无服务器云函数 hello
实现发起一个 HTTP 请求到 https://libget.com/hello 并获得响应正文(Body)作为无服务器云函数的返回值。
此外,在本地运行环境创建一个 Python 脚本并实现计划在本机时间的 10 秒后、20 秒后和 30 秒后调用无服务器云函数 hello
并获得无服务器云函数的实际返回值。
在下文中,我们将通过几个步骤向您演示编写符合当前场景要求的代码示例:
首先,我们需要根据本场景要求编写无服务器云函数 hello
的源代码。
为便于发起 HTTP GET 请求,我们采用 Python HTTP 库 requests
实现。
接着,我们需要为无服务器云函数 hello
编写入口函数。
在上文示例代码中,我们导入依赖模块 requests
并使用 requests.get 函数向 https://libget.com/hello 发起 HTTP GET 请求并将响应正文(Body)作为无服务器云函数 hello
的返回值。
然后,我们需要根据本场景要求编写一个 Python 脚本并实现计划定时调用无服务器云函数 hello
。
首先我们需要在无服务器云函数 hello
中导入 Tencent Cloud SDK for Python 相关命名空间和模块:
为便于获取计划定时调用的无服务器云函数运行结果,我们需要定义一个调用完成后的回调函数。当指定无服务器云函数在指定时间调用并运行完成后,Tencent Cloud SDK for Python 将调用指定回调函数。
接着,我们需要为 Python 脚本编写入口函数代码。
在上文示例代码中我们首先实例化一个无服务器云函数产品客户端和访问凭据,接着获取当前本机 UNIX 时间戳,然后循环 3 次并分别创建相对于前一步获取的本机 UNIX 时间戳的 10 秒、20 秒和 30 秒定时无服务器云函数调用任务,最后运行已创建的所有定时调用任务并等待完成。
值得注意的是上文中示例代码以同步编程方式使用 Tencent Cloud SDK for Python,对于异步编程方式将无需调用无服务器云函数产品客户端实例的 run_schedule
方法,所有已创建的定时调用任务将被 Tencent Cloud SDK for Python 自动调度运行。
最后,我们运行本场景中所创建并编写的本地 Python 脚本,如果一切正常将打印输出:
本文将向您介绍并演示借助 Tencent Cloud SDK for Python 如何以 Python 原生函数的形式调用指定无服务器云函数。
当我们谈论到如何使用 Tencent Cloud SDK for Python 调用无服务器云函数时,或许首先想到的是利用无服务器云函数产品客户端所提供的 invoke
、easy_invoke
或 schedule_invoke
等实例方法快速发起对指定无服务器云函数的调用并获得运行结果。
但除此之外,我们还可以借助 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性以 Python 原生函数的形式调用指定无服务器云函数。
通常情况下我们在当前运行环境中对无服务器云函数的调用过程或许都可以被称之为 RPC(远程过程调用),开发者可以感知到 RPC 过程的存在。例如我们使用无服务器云函数产品客户端所提供的 easy_invoke
实例方法调用指定无服务器云函数时,我们可以感知到这是一次调用请求。
通过利用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的 Python 原生调用高级特性,我们可以将对无服务器云函数的调用封装为对一个 Python 原生函数的调用。这样当开发者对相关联的 Python 原生函数调用时等同于对指定无服务器云函数的调用,从而屏蔽 RPC 过程感知。
没有理解?没关系,在下文中我们将通过一个简单的场景介绍并演示如何使用该高级特性。
假定我们在数据中心 ap-shanghai
的命名空间 default
拥有一个已创建就绪的无服务器云函数 addend
,其无服务器云函数的配置为:
配置
值
运行环境
Python 3.6
内存上限
64 MBytes
入口函数
index.main
运行角色
QCS_SCFExcuteRole
其无服务器云函数的源代码为:
在该场景中,我们要求在本地 Python 脚本中实现对无服务器云函数 addend
的调用,传入函数事件字段 value1
和 value2
并获得实际返回值。
其调用必须以 Python 原生函数的形式呈现。
在下文中,我们将通过几个步骤向您演示编写符合当前场景要求的代码示例:
首先,我们需要导入依赖的 Tencent Cloud SDK for Python 的命名空间和模块:
接着,我们需要为 Python 脚本编写入口函数,所有代码逻辑将在该函数中实现。
在上文示例代码中,我们首先实例化一个无服务器云函数产品客户端和访问凭据;接着使用无服务器云函数产品客户端的实例方法 select_function
选择一个无服务器云函数并获得与之对应的 Python 原生函数 addend
;最后调用 Python 原生函数 addend
并打印输出无服务器云函数 addend
的实际返回值。
在获得的 Python 原生函数 addend
内部,其将调用与之关联的无服务器云函数产品客户端的实例方法 easy_invoke
实现对指定无服务器云函数的调用。
请注意,对关联无服务器云函数的 Python 原生函数调用时其参数必须完全使用关键字参数传递,参数名即为指定无服务器云函数运行时事件的字段名称,否则行为是未定义的。
在上文示例代码中所涉及的 API 如下:
最后,我们尝试运行本地 Python 脚本,如果一切正常将输出:
或许您已经注意到,使用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端的实例方法 select_function
所获得的关联 Python 原生函数无法使用顺序参数,且无法与类方法、类实例方法相结合并获得 IDE 所提供的引导提示。
如果您希望以类方法、类实例方法或函数的形式以可控的函数或方法签名组成您的代码,或许使用 Tencent Cloud SDK for Python 的无服务器云函数客户端所提供的另一项高级特性更加合适:
本文将向您进一步介绍并演示借助 Tencent Cloud SDK for Python 如何将无服务器云函数绑定到类方法、类实例方法或函数,这是获得关联无服务器云函数的 Python 原生函数的进阶。
这是由 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性,如果您未曾阅读如何选择一个无服务器云函数并获得与之关联的 Python 原生函数的实践文档,请先阅读:
在上篇实践文档中我们得知 Tencent Cloud SDK for Python 的无服务器云函数产品客户端的实例方法 select_function
可以选择一个无服务器云函数并获得与之相关联的 Python 原生函数,通过对 Python 原生函数的调用即为对关联无服务器云函数的调用,从而屏蔽 RPC 感知。
遗憾的是,我们无法控制所获得与无服务器云函数关联的 Python 原生函数的签名和形态,且不能将其集成为类方法或类实例方法。与此同时,我们或许还需要在全局范围内维护一个 Python 原生函数实例。
不过无需担心,Tencent Cloud SDK for Python 的无服务器云函数产品客户端提供了另一种高级特性用于解决上述问题,我们将其称之为绑定到无服务器云函数。
与关联到无服务器云函数的高级特性不同,绑定到无服务器云函数特性使用 Python 高级特性装饰器实现,这意味着开发者可以以更简洁、美观的代码快速集成该特性。什么是 Python 装饰器?
没有理解?没关系,在下文中我们将通过几个简单的应用场景向您进一步说明如何使用绑定到无服务器云函数特性组成您的应用程序代码逻辑。
在下文中我们将列举几段连续的示例代码并向您介绍 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的绑定到无服务器云函数特性的工作流程,我们仍然以无服务器云函数 addend
为例:
首先我们需要在应用程序中导入所依赖的 Tencent Cloud SDK for Python 相关命名空间和模块:
然后我们需要在应用程序源代码的适合层级实例化一个或多个无服务器云函数产品客户端和访问凭据,在下文中我们将选择 Python 模块全局变量作为适合层级:
在上文示例代码中,我们所实例化的无服务器云函数产品客户端由 Python 模块全局变量 function_client
存储。
Python 原生函数可能是我们将应用程序与无服务器云函数相集成的多数选择。
我们首先为无服务器云函数 addend
编写在 Python 原生函数的投射:
在上文示例代码中,Python 原生函数 addend
将引发 NotImplementedError
异常,该异常指示当前函数逻辑未实现。
接下来我们需要做的是,为无服务器云函数 addend
的 Python 原生投射函数套用一层装饰器:
上文示例代码中是 Python 原生投射函数 addend
套用 Python 装饰器后的形态。
最后,我们尝试调用在上文示例代码中定义的 Python 原生函数 addend
并获得运行结果:
如果一切正常,我们将得到打印输出:
绑定的无服务器云函数 addend
运行事件为:
有时或许我们希望使用 Python 类方法或类实例方法与无服务器云函数相集成。
首先我们需要编写一个可实例化的类以演示如何将类方法或类实例方法绑定到无服务器云函数:
在上文示例代码中,我们定义了符号名为 Addition
的实例类。该类拥有一个实例方法 get_result
用于计算类属性 value1
和 value2
的相加值。
接着,我们需要将实例类 Addition 的实例方法 get_result
绑定到无服务器云函数 addend
以实现加法运算功能。套用装饰器后的实例类形态如下:
在上文示例代码中我们额外使用了一个在绑定 Python 函数时未使用也不受支持的装饰器参数 include_attributes
。该参数允许提供一个列表实例,列表实例的成员为需要从当前所绑定类方法或类实例方法的类实例或静态类中所额外包含的公开属性名称。
被装饰器参数 include_attributes
包含的类公开属性名和值将作为绑定的无服务器云函数运行时事件的字段名称和值,被绑定的类方法或类实例方法的参数也将包括在其中,这与是否使用并设置装饰器参数 include_attributes
的值无关。
请注意,被绑定的类方法的首个参数名称必须为 cls;被绑定的类实例方法的首个参数名称必须为 self,否则行为是未定义的。
最后,我们尝试实例化一个 Addition
类并调用其实例方法 get_result
获得加法运算结果:
如果一切正常,我们将得到打印输出:
绑定的无服务器云函数 addend
运行事件为:
或许您已经注意到,使用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的绑定到无服务器云函数高级特性时,调用被绑定的函数、类方法或类实例方法支持顺序参数和关键字参数,与 Python 原生函数、类方法或类实例方法的参数传递规则一致。
这是因为 Tencent Cloud SDK for Python 在实现过程中使用 Python 反射(自省)高级特性实现对被绑定可调用对象的参数名称的检查。
本文将向您进一步介绍并演示借助 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
的无服务器云函数:
属性
值
数据中心
ap-shanghai
命名空间
default
函数名称
arithmetic
运行环境
Python 3.6
然后,我们需要为无服务器云函数 arithmetic 编写代码。与以往不同,我们将使用 Tencent Cloud SDK for Python 提供的无服务器云函数例程特性和框架。首先我们需要导入使用的命名空间和模块:
接着我们需要调用 use_routine_dispatcher
函数为当前无服务器云函数启用例程派发器框架:
在上述代码中,我们得到一个被称之为例程派发器类型的实例并由变量 dispatcher
存储。例程派发器实际上是一个可解析无服务器云函数例程调用协议的路由,每一个例程派发器实例将管理一个或多个已注册的无服务器云函数例程。没有理解?没关系,让我们继续向下阅读。
然后我们需要编写 2 个例程,分别是 addend
和 subtract
,分别对应加法和减法的算术运算:
或许您已经注意到,无服务器云函数例程实际上是一个套用例程派发装饰器的一个 Python 原生函数,在上述代码中我们仅需要为 Python 原生函数使用 @dispatcher.routine
装饰器即可将其注册为可调用的无服务器云函数例程。
到此,无服务器云函数 arithmetic
的代码已完成编写。
在上文中我们已经创建名为 arithmetic
的无服务器云函数,并分别实现适用于加法和减法算术运算的无服务器云函数例程,现在让我们在一个本地函数中调用它们:
首先,我们需要导入所依赖的命名空间和模块:
接着,我们需要在本地函数的 Python 模块全局获取一个无服务器云函数产品客户端实例:
然后,我们需要为无服务器云函数的 addend
和 subtract
分别创建 2 个 Python 原生函数,并将他们分别绑定到对应的无服务器云函数例程:
是的,对无服务器云函数例程的绑定与对无服务器云函数的绑定非常相似。
我们仅需要定义 2 个与无服务器云函数例程签名完全一致的 Python 原生函数,然后为其分别套用 @function_client.bind_routine
装饰器即可。现在对 Python 原生函数 addend
和 subtract
的调用等同于对无服务器云函数 arithmetic
的例程 addend
和 subtract
的调用。
值得注意的是,我们将这些与无服务器云函数例程签名相同的 Python 函数称之为 Python 原生扮演函数。
当然,如果您不希望在应用程序中为每一个无服务器云函数例程编写对应的 Python 原生函数,您可以选择由 Tencent Cloud SDK for Python 代您创建一个与指定无服务器云函数例程相关联的 Python 原生函数:
现在,变量 addend
和 subtract
为可调用的 Python 原生函数对象。
最后,我们尝试在本地函数中调用无服务器云函数 arithmetic
的例程 addend
和 subtract
,并打印输出加法和减法算术运算的结果:
请注意,如果您使用方法 seletc_routine
创建无服务器云函数例程的 Python 原生扮演函数,您需要完全使用关键字参数调用,否则 Tencent Cloud SDK for Python 无法确定每个参数对应的位置:
如果您希望在调用无服务器云函数例程时获得 RPC 流程感知,您可以使用方法 routine_invoke
:
如果一切正常,您将会在终端看到如下输出: