MST

星途 面试题库

面试题:Go中Context辅助函数如何用于控制并发任务的超时

请描述在Go语言中,如何使用Context的辅助函数来设置并发任务的超时时间,并给出一个简单的代码示例,展示如何在一个goroutine中使用带有超时设置的Context。
14.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,context包提供了WithTimeout辅助函数来设置并发任务的超时时间。WithTimeout函数接受一个父Context、一个超时时间duration,返回一个带有超时的Context以及取消函数CancelFunc

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

package main

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

func main() {
    // 创建一个带有5秒超时的Context
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel() // 确保在函数结束时取消Context,以释放资源

    // 在goroutine中使用带有超时设置的Context
    go func(ctx context.Context) {
        select {
        case <-time.After(10 * time.Second):
            fmt.Println("任务执行完成(模拟长时间任务)")
        case <-ctx.Done():
            fmt.Println("任务被取消,原因:", ctx.Err())
        }
    }(ctx)

    // 等待一段时间,确保goroutine有机会执行
    time.Sleep(6 * time.Second)
}

在上述代码中:

  1. 使用context.WithTimeout创建了一个带有5秒超时的Context
  2. 在一个新的goroutine中模拟一个需要10秒完成的任务,并通过select语句监听任务完成信号(time.After)和Context的取消信号(ctx.Done())。
  3. 主函数等待6秒,确保goroutine有足够时间运行,由于设置的超时时间为5秒,所以goroutine会收到取消信号并输出相应信息。