Golang Signal通知上下文

在Golang中,如何使用signal通知上下文?当程序收到中断信号时,如何优雅地关闭goroutine和释放资源?能否提供一个示例代码展示如何正确使用context和os/signal包来处理信号?

2 回复

在Golang中,可以使用os/signal包和context包实现信号通知。通过signal.NotifyContext创建带信号处理的上下文,当收到指定信号(如SIGINT、SIGTERM)时,上下文会被取消,便于优雅退出程序。

更多关于Golang Signal通知上下文的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,可以使用os/signal包和context包来实现信号通知上下文,以便优雅地处理程序终止或其他系统信号。通过监听信号(如SIGINTSIGTERM),可以触发上下文的取消操作,从而通知程序进行清理和退出。

示例代码:

package main

import (
    "context"
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    // 创建一个可取消的上下文
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // 设置信号监听:SIGINT(Ctrl+C)和SIGTERM(终止信号)
    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

    // 启动一个goroutine来等待信号
    go func() {
        sig := <-sigChan // 阻塞直到收到信号
        fmt.Printf("接收到信号: %v\n", sig)
        cancel() // 取消上下文,通知其他部分停止
    }()

    // 模拟一个长时间运行的任务,检查上下文取消
    go func() {
        for {
            select {
            case <-ctx.Done():
                fmt.Println("任务被取消,进行清理...")
                return
            default:
                fmt.Println("任务运行中...")
                time.Sleep(1 * time.Second)
            }
        }
    }()

    // 等待上下文取消
    <-ctx.Done()
    fmt.Println("程序退出")
}

说明:

  • 信号监听:使用signal.Notify捕获SIGINT(例如Ctrl+C)和SIGTERM(例如kill命令)。
  • 上下文取消:当收到信号时,调用cancel()函数,这会关闭上下文的Done通道。
  • 优雅退出:通过检查ctx.Done(),任务可以及时停止并执行清理操作。

这种方法确保程序在收到终止信号时能够安全退出,避免资源泄漏。

回到顶部