MST

星途 面试题库

面试题:Go语言中context包如何用于控制并发任务的超时

请描述在Go语言中,如何使用context包来设定一个并发任务的执行超时时间,并给出一段简单的示例代码来展示这种用法。
36.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 描述使用context包设定并发任务执行超时时间的方法
    • 在Go语言中,context包用于在多个goroutine之间传递截止时间、取消信号等相关信息。
    • 要设定并发任务的执行超时时间,通常使用context.WithTimeout函数。该函数接受两个参数,一个是父context(一般使用context.Background作为顶层上下文),另一个是超时时间。它会返回一个新的context和一个取消函数CancelFunc
    • 在并发任务中,通过监听新contextDone通道来判断是否超时。如果Done通道接收到数据,说明超时或者被取消,此时可以停止任务的执行。
  2. 示例代码
package main

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

func main() {
    // 创建一个带有5秒超时的context
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 启动一个goroutine执行任务
    go func(ctx context.Context) {
        select {
        case <-time.After(10 * time.Second):
            fmt.Println("任务正常完成")
        case <-ctx.Done():
            fmt.Println("任务超时")
        }
    }(ctx)

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

在上述代码中:

  • 首先通过context.WithTimeout(context.Background(), 5*time.Second)创建了一个带有5秒超时的context
  • 然后在一个新的goroutine中模拟执行一个任务,这个任务正常完成需要10秒。
  • 通过select语句监听time.After(10 * time.Second)ctx.Done(),如果ctx.Done()先接收到数据,说明任务超时,打印“任务超时”;如果time.After(10 * time.Second)先接收到数据,说明任务正常完成,打印“任务正常完成”。
  • 主goroutine通过time.Sleep(15 * time.Second)等待一段时间,以确保新启动的goroutine有机会执行。