MST

星途 面试题库

面试题:Go中匿名函数在并发场景下如何传递和使用上下文

在Go语言中,假设你有一个并发任务,需要使用匿名函数处理。现在要求在这个匿名函数中传递和使用上下文(context),以实现任务的取消和超时控制。请编写一段示例代码展示这一过程,并简要说明context在并发匿名函数中的重要性。
29.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

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

func main() {
    // 创建一个带有取消功能的上下文
    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)
    cancel()

    // 等待一段时间,确保任务有机会处理取消信号
    time.Sleep(1 * time.Second)
}

context在并发匿名函数中的重要性:

  1. 取消控制:在复杂的并发程序中,能够取消某个正在运行的任务是非常重要的。通过传递上下文到匿名函数,外部可以通过取消上下文来通知匿名函数停止执行,从而优雅地结束任务,避免资源泄露等问题。
  2. 超时控制:使用context.WithTimeout可以设定任务的最长执行时间,当超过这个时间,上下文会自动取消,匿名函数可以感知到并停止执行,确保任务不会无限期运行。
  3. 跨层级传递信号:上下文可以在函数调用链中传递,即使在匿名函数深处,也能收到来自顶层的取消或超时信号,使得整个并发系统的控制更加统一和灵活。