上云无忧 > 文档中心 > 腾讯云云函数使用教程 - 异步执行事件管理
云函数 SCF
腾讯云云函数使用教程 - 异步执行事件管理

文档简介:
对于异步执行事件管理,SCF 提供了获取异步事件列表及状态、终止函数异步事件功能。 注意: 本文涉及功能仅支持 异步执行 函数。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠
对于异步执行事件管理,SCF 提供了获取异步事件列表及状态、终止函数异步事件功能。
注意
本文涉及功能仅支持 异步执行 函数。

获取异步事件列表及状态

异步执行函数事件有以下四种运行状态:
运行中:事件异步执行中。
调用完成:事件异步执行成功,正常返回。
调用失败:事件异步执行失败,异常返回。
调用终止:用户主动对运行中的事件发起终止,异步执行停止并返回。

相关接口

API 接口
说明
相关文档
ListAsyncEvents
异步执行函数事件信息数据列表,提供根据事件 RequestId、函数名、函数版本、事件状态、事件调用/结束时间等条件对异步执行事件信息的查询功能。
仅可查询数据范围为开启事件追踪后3天内数据。

拉取函数异步事件列表
GetAsyncEventStatus
提供根据请求 RequestId 获取异步事件执行状态的功能,事件状态保留3 * 24小时(从事件结束开始计时)。
获取函数异步事件状态
注意:
使用时请关注各 API 的频率限制,获取异步事件列表接口ListAsyncEvents不建议高频调用,如需查询异步事件执行结果,请使用获取函数异步事件状态GetAsyncEventStatus接口。

终止函数异步事件

SCF 提供终止调用发送终止信号两种异步事件终止方式,区别和使用方式如下:

相关接口

API 接口
说明
相关文档
TerminateAsyncEvent
异步执行函数通过调用返回的事件 RequestId,对运行中异步执行事件下发终止指令,终止完成后返回。本接口默认行为是终止调用,参数 GraceShutdown 为 True 时向请求发送 SIGTERM 终止信号,可在函数内部对该信号进行监听并自定义信号处理逻辑。
终止正在运行中的函数异步事件

终止调用

在调用函数时,SCF 会分配一个实例处理函数请求或事件。函数代码运行完毕返回后,该实例会处理其他请求。如果在请求到来时,所有实例都在运行中,云函数则会分配一个新的实例。(更多实例相关信息请参考 并发概述
当异步执行函数事件接收到终止调用后,SCF 会强制停止实例运行,并回收该实例,下一次请求到来时,如无空闲实例,SCF 会分配一个新的实例来处理请求。
适用场景
异步执行函数运行异常、死循环等需要提前中断函数执行的场景。
注意事项
终止调用会强制停止实例并触发实例回收,这意味着实例中缓存的信息将无法正常获取(比如 /tmp 目录下的文件)。如需使用该功能,请及时将实例中缓存的问题写入其他持久化存储介质,避免实例回收后文件丢失。

发送终止信号

当调用终止函数异步事件 API 并指定 GraceShutdown参数为 True时,SCF 将会向 API 入参中指定的事件发送一个终止信号,该信号固定为 SIGTERM,可在函数中监听该信号并自定义接收到信号后的处理逻辑,包括但不限于停止函数执行。
当异步执行函数事件接收到 SIGTERM 信号后:
如果函数代码中监听并定义了信号处理函数,会开始执行对应的信号处理函数逻辑;
如果函数代码中没有监听信号,函数进程会退出,并返回 439 错误码(用户进程退出 User process exit when running)。
SCF 会将事件的信号接收情况记录进函数执行日志中:
信号接收成功:日志中将记录 [PLATFORM] Signal received successfully.
信号接收失败:日志中将记录 [PLATFORM] Signal reception failed.

适用场景

在函数执行过程中,由于业务需要而停止函数运行,并在函数停止运行前自定义处理逻辑。

使用方法

下文以监听到 SIGTERM 信号后通过自定义信号处理函数终止函数运行为例:

代码部署

Python
Golang
			
# -*- coding: utf8 -*-
import time
import signal
class GracefulKiller:
kill_now = False
def __init__(self):
# Register signal processing function
signal.signal(signal.SIGTERM, self.graceshutdown)
def graceshutdown(self, *agrg):
print("do something before shutdown.")
self.kill_now = True
def main_handler(event, context):
killer = GracefulKiller()
while not killer.kill_now:
time.sleep(1)
print(killer.kill_now)
print("Graceful shutdown.")
return("END")
			
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/tencentyun/scf-go-lib/cloudfunction"
)
type DefineEvent struct {
// test event define
Key1 string `json:"key1"`
Key2 string `json:"key2"`
}
func hello(ctx context.Context, event DefineEvent) (string, error) {
go graceshutdown()
sleepNum := 0
for {
sleepNum++
fmt.Println("sleep:", sleepNum)
time.Sleep(time.Second)
}
}
// Register signal processing function
func graceshutdown() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGTERM)
sig := <-sigs
log.Printf("receive signal %s", sig.String())
//do something before shutdown.
os.Exit(0)
}
func main() {
// Make the handler available for Remote Procedure Call by Cloud Function
cloudfunction.Start(hello)
}

镜像部署

Python
		
# -*- coding: utf8 -*-
from flask import Flask, request
import time
import signal
app = Flask(__name__)
class GracefulKiller:
kill_now = False
def __init__(self):
# Register signal processing function
signal.signal(signal.SIGTERM, self.graceshutdown)
def graceshutdown(self, *agrg):
print("do something before shutdown.")
self.kill_now = True
@app.route('/event-invoke', methods = ['POST'])
def invoke():
while not killer.kill_now:
time.sleep(1)
print(killer.kill_now)
print("Graceful shutdown.")
return("END")
if __name__ == '__main__':
killer = GracefulKiller()
app.run(host='0.0.0.0', port=9000)
相似文档
  • 操作场景: 命名空间为函数提供了相对独立的运行环境,在创建云函数时,您可以选择函数所在的命名空间,从而更有效地管理您的云函数。
  • 为什么要备案? 根据国务院令第292号《互联网信息服务管理办法》和工信部令第33号《非经营性互联网信息服务备案管理办法》规定,国家对经营性互联网信息服务实行许可制度,对非经营性互联网信息服务实行备案制度。未获取许可或者未履行备案手续的,不得从事互联网信息服务,否则属于违法行为。
  • 操作场景: 腾讯云文件存储 CFS 提供可扩展的共享文件存储服务,可与腾讯云服务器、容器服务或者批量处理等服务搭配使用。CFS 符合标准的 NFS 文件系统访问协议,为多个计算节点提供共享的数据源,支持弹性容量和性能的扩展,现有应用无需修改即可挂载使用,是一种高可用、高可靠的分布式文件系统,适合于大数据分析、媒体处理和内容管理等场景。
  • 概述: 当客户端向某个地址发起访问时,通常会查询本地 DNS 缓存中是否有相关记录,有则会直接访问对应 IP 地址,如果没有则会委托递归服务器进行全球查询。
  • 函数资源托管模式概述: 函数资源托管模式决定了函数 SCF 运行时的资源池。默认情况下,开启函数服务后,平台会为每一个地域都分配一个函数公有云资源池,资源池由一些底层机器组成,体现为 128GB 的函数并发配额,您还可以通过购买套餐包的方式提升地域甚至是命名空间的并发额度,平台会根据新的并发额度自动分配匹配的机器,保障函数运行。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部