MST

星途 面试题库

面试题:Go中context如何在多个goroutine间传递以管理请求流转

在Go语言中,假设你正在开发一个分布式系统的模块,需要在多个goroutine之间传递请求上下文来管理请求的生命周期。请描述如何使用context包来实现这一需求,并给出一个简单的示例代码,展示如何创建一个context,将其传递到不同的goroutine中,并且在外部控制这些goroutine的结束。
17.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,context包用于在多个goroutine之间传递请求上下文并管理请求的生命周期。以下是实现这一需求的步骤及示例代码:

  1. 创建上下文:通常使用context.Background()作为根上下文,然后基于它创建具有取消功能或超时功能的上下文。
  2. 传递上下文:将上下文作为参数传递给需要管理生命周期的goroutine函数。
  3. 控制结束:通过调用取消函数(cancel)或等待上下文超时来结束goroutine

示例代码如下:

package main

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

func worker(ctx context.Context, id int) {
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("Worker %d stopped\n", id)
            return
        default:
            fmt.Printf("Worker %d is working\n", id)
            time.Sleep(100 * time.Millisecond)
        }
    }
}

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

    // 启动多个goroutine
    for i := 1; i <= 3; i++ {
        go worker(ctx, i)
    }

    // 模拟一些工作
    time.Sleep(500 * time.Millisecond)

    // 取消上下文,所有goroutine将收到结束信号
    cancel()

    // 等待所有goroutine结束
    time.Sleep(200 * time.Millisecond)
}

在上述代码中:

  1. context.WithCancel(context.Background())创建了一个可取消的上下文ctx和取消函数cancel
  2. worker函数接收上下文ctx,在select语句中监听ctx.Done()通道,当接收到信号时,goroutine结束。
  3. main函数中,启动了3个worker goroutine,然后通过调用cancel()函数来取消上下文,所有worker goroutine将收到结束信号并停止工作。