MST

星途 面试题库

面试题:Go中context如何用于管理子协程退出逻辑

请简述在Go语言中,如何使用context来管理子协程的退出逻辑,并给出一个简单的示例代码,说明如何创建context、传递给子协程以及子协程如何响应context的取消信号。
12.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,context包用于管理子协程的退出逻辑。以下是简述及示例代码:

创建context

通过context包提供的函数来创建context,常见的有context.Background()context.TODO(),还可以使用context.WithCancelcontext.WithDeadlinecontext.WithTimeout等函数创建带有取消功能的context

传递给子协程

将创建好的context作为参数传递给需要管理的子协程。

子协程响应取消信号

子协程通过监听context的取消信号(ctx.Done()通道关闭)来决定何时退出。

以下是一个简单示例代码:

package main

import (
    "context"
    "fmt"
    "time"
)

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

    // 启动子协程
    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println("子协程收到取消信号,退出")
                return
            default:
                fmt.Println("子协程正在运行...")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)

    // 模拟一些业务逻辑
    time.Sleep(3 * time.Second)

    // 取消context,通知子协程退出
    cancel()

    // 等待子协程退出
    time.Sleep(1 * time.Second)
}

在上述代码中:

  1. 使用context.WithCancel创建了一个可取消的context,并返回ctx和取消函数cancel
  2. 子协程通过select监听ctx.Done()通道,当通道关闭时(即收到取消信号),执行退出逻辑。
  3. 主函数在运行一段时间后调用cancel函数,取消context,从而通知子协程退出。