tencent cloud

云函数

动态与公告
产品动态
产品公告
新手指引
产品简介
产品概述
相关概念
工作原理
产品优势
应用场景
相关产品
购买指南
计费概述
计费方式
计费项与计费方式
函数算力支持
免费额度
产品定价
计费示例
欠费与停服说明
快速入门
使用控制台创建一个事件函数
操作指南
配额管理
函数管理
Web 函数管理
日志管理
并发管理
触发器管理
函数 URL
自定义域名
版本管理
别名管理
权限管理
运行实例管理
插件管理
监控与告警管理
网络配置
层管理
执行配置
扩展存储管理
DNS 缓存配置
资源托管模式管理
近离线资源托管模式
工作流
触发器
触发器概述
触发器事件消息结构汇总
API 网关触发器
COS 触发器
CLS 触发器
定时触发器
CKafka 触发器
Apache Kafka 触发器
MQTT 触发器
触发器配置描述
MPS 触发器
CLB 触发器说明
云 API 触发器
开发指南
基本概念
测试云函数
环境变量
依赖安装
使用容器镜像
使用 Docker 安装依赖
错误类型与重试策略
死信队列
云函数接入数据库
自动化部署
云函数状态码
常见错误码解决方法
开发者工具
Serverless Web IDE
函数间调用 SDK
第三方工具
代码开发
Python
Node.js
Golang
PHP
Java
Custom Runtime
使用镜像部署函数
Web 框架部署
通过命令行完成框架部署
快速部署 Egg 框架
快速部署 Express 框架
快速部署 Flask 框架
快速部署 Koa 框架
快速部署 Laravel 框架
快速部署 Nestjs 框架
快速部署 Nextjs 框架
快速部署 Nuxtjs 框架
快速部署 Django 框架
实践教程
最佳实践概述
云产品联合解决方案
业务开发相关实践
实时音视频 TRTC
对象存储 COS
消息队列 CKafka
日志服务CLS
负载均衡 CLB
视频处理 MPS
内容分发网络 CDN
云数据仓库 PostgreSQL
云点播 VOD
短信 SMS
Elasticsearch Service
定时任务
视频处理
客户案例
腾讯在线教育
在线教育行业案例
游戏聊天系统
腾讯互娱国际(IEGG)
API 文档
History
Introduction
API Category
Making API Requests
Other APIs
Namespace APIs
Layer Management APIs
Async Event Management APIs
Trigger APIs
Function APIs
函数和层的状态说明
Data Types
Error Codes
SDK文档
常见问题
通用问题
Web 函数相关问题
计费相关问题
网络相关问题
日志相关问题
SCF 工具相关问题
事件处理相关问题
API 网关触发器相关问题
相关协议
Service Level Agreement
联系我们
词汇表

异步执行事件管理

PDF
聚焦模式
字号
最后更新时间: 2024-04-19 16:25:56
对于异步执行事件管理,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)



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈