MST

星途 面试题库

面试题:Go中context如何用于控制协程的生命周期

请阐述在Go语言中,context是如何被用来管理协程生命周期的?并给出一个简单示例,展示如何使用context来取消一个正在运行的协程。
48.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,context主要通过以下方式管理协程生命周期:

  1. 传递信号context可以在不同的协程间传递取消、超时等信号。当父协程取消context时,所有基于该context派生的子协程都会收到取消信号,从而安全地退出。
  2. 携带请求范围的数据context可以携带与请求相关的数据,例如认证信息等,这些数据可以在不同协程间传递。

以下是一个简单示例,展示如何使用context取消正在运行的协程:

package main

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

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("协程收到取消信号,退出")
            return
        default:
            fmt.Println("协程正在工作...")
            time.Sleep(1 * time.Second)
        }
    }
}

使用示例:

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    go worker(ctx)

    time.Sleep(3 * time.Second)
    fmt.Println("主协程发起取消操作")
    cancel()

    time.Sleep(1 * time.Second)
    fmt.Println("主协程退出")
}

上述代码中:

  1. context.WithCancel创建了一个可取消的context,并返回一个取消函数cancel
  2. worker函数通过select监听ctx.Done()通道,当该通道接收到信号时,表示context被取消,协程安全退出。
  3. main函数中,启动worker协程,3秒后调用cancel函数取消context,从而使worker协程收到取消信号并退出。