MST

星途 面试题库

面试题:Go中如何在批处理任务里初步使用context进行上下文协调

假设你有一个批处理任务,其中包含多个子任务,需要使用Go的context来管理上下文协调。请描述实现思路,并给出一个简单的代码示例,展示如何创建context、传递给子任务以及在必要时取消任务。
49.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 创建上下文:使用 context.Background() 创建一个基础上下文,然后通过 context.WithCancelcontext.WithTimeoutcontext.WithDeadline 等函数创建可取消或有时间限制的上下文。
  2. 传递上下文:将创建好的上下文传递给需要管理的子任务函数,这些函数通常是 goroutine
  3. 取消任务:在主函数或其他逻辑中,根据需要调用取消函数(通过 context.WithCancel 返回的取消函数)来取消上下文,所有基于该上下文的子任务会收到取消信号并进行相应处理。

代码示例

package main

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

func subTask(ctx context.Context, taskName string) {
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("%s 任务已取消\n", taskName)
            return
        default:
            fmt.Printf("%s 正在执行...\n", taskName)
            time.Sleep(1 * time.Second)
        }
    }
}

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

    // 启动子任务
    go subTask(ctx, "子任务1")
    go subTask(ctx, "子任务2")

    // 模拟一段时间后取消任务
    time.Sleep(3 * time.Second)
    cancel()

    // 等待一段时间,确保子任务收到取消信号并处理
    time.Sleep(2 * time.Second)
}