tencent cloud

文档反馈

异步执行事件管理

最后更新时间: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)
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持