MST

星途 面试题库

面试题:Go中上下文(Context)在并发编程里如何用于控制超时

在Go的并发编程中,经常需要控制某个操作的执行时间,防止其无限期运行。请说明如何使用上下文(Context)来实现这一功能,并给出一个简单示例代码,示例需包含一个模拟的长时间运行任务以及如何通过上下文设置超时来取消该任务。
42.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用context包来控制操作的执行时间。context包提供了WithTimeout函数来设置超时时间。

示例代码如下:

package main

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

func longRunningTask(ctx context.Context) {
    select {
    case <-ctx.Done():
        fmt.Println("任务被取消:", ctx.Err())
    case <-time.After(2 * time.Second):
        fmt.Println("任务正常完成")
    }
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    defer cancel()

    go longRunningTask(ctx)

    time.Sleep(3 * time.Second)
}

在上述代码中:

  1. context.WithTimeout函数创建了一个带有超时设置的上下文ctx和取消函数cancel。这里设置的超时时间为1秒。
  2. longRunningTask函数模拟一个长时间运行的任务,它使用select语句监听ctx.Done()通道和time.After通道。
    • 如果ctx.Done()通道接收到数据,说明任务被取消,打印取消原因。
    • 如果time.After通道接收到数据,说明任务正常完成。
  3. main函数中,启动longRunningTask协程,并等待3秒,确保任务有足够时间执行或被取消。

这样,通过上下文的超时设置,可以有效控制任务的执行时间。