MST

星途 面试题库

面试题:Go中Goroutine生命周期管理之基本策略

在Go语言中,简述使用`context`包来管理goroutine生命周期的基本方式,包括如何创建`context`以及如何在goroutine中监听取消信号。
32.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 创建context
    • context.Background:用于创建一个根context,通常作为其他context的父context,例如:
    ctx := context.Background()
    
    • context.TODO:当不确定使用哪种context时,可以使用context.TODO,它本质上也是一个空的context,例如:
    ctx := context.TODO()
    
    • context.WithCancel:用于创建一个可取消的context。它接受一个父context,返回一个新的context和一个取消函数cancel
    parent := context.Background()
    ctx, cancel := context.WithCancel(parent)
    defer cancel() // 确保在函数结束时调用取消函数,释放资源
    
    • context.WithDeadline:创建一个带有截止时间的context。它接受一个父context和一个截止时间deadline
    parent := context.Background()
    deadline := time.Now().Add(5 * time.Second)
    ctx, cancel := context.WithDeadline(parent, deadline)
    defer cancel()
    
    • context.WithTimeout:创建一个带有超时时间的context。它接受一个父context和一个超时时间timeout
    parent := context.Background()
    ctx, cancel := context.WithTimeout(parent, 5*time.Second)
    defer cancel()
    
  2. 在goroutine中监听取消信号: 在goroutine中,可以通过ctx.Done()通道来监听取消信号。当context被取消(通过调用cancel函数、达到截止时间或超时)时,ctx.Done()通道会被关闭。
    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                // 处理取消逻辑,例如清理资源等
                fmt.Println("goroutine收到取消信号,退出")
                return
            default:
                // 正常业务逻辑
                fmt.Println("goroutine正在执行任务")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)