MST

星途 面试题库

面试题:Go语言在并发场景下的错误处理策略

在一个高并发的Go程序中,有多个goroutine同时执行不同的任务,每个任务都可能返回错误。要求设计一种错误处理机制,能够及时捕获所有goroutine中的错误,并汇总错误信息,同时要考虑性能和资源消耗。请详细阐述设计思路,并给出核心代码实现。
14.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用 sync.WaitGroup:用于等待所有 goroutine 完成任务。
  2. 错误通道:创建一个通道,用于各个 goroutine 发送错误信息。
  3. 汇总错误:在主 goroutine 中,从错误通道接收错误并汇总到一个切片中。

核心代码实现

package main

import (
    "fmt"
    "sync"
)

func task(id int, wg *sync.WaitGroup, errCh chan error) {
    defer wg.Done()
    // 模拟任务执行
    if id == 2 {
        errCh <- fmt.Errorf("task %d failed", id)
        return
    }
    fmt.Printf("task %d completed successfully\n", id)
}

func main() {
    var wg sync.WaitGroup
    errCh := make(chan error)
    tasks := 3

    for i := 1; i <= tasks; i++ {
        wg.Add(1)
        go task(i, &wg, errCh)
    }

    go func() {
        wg.Wait()
        close(errCh)
    }()

    var errors []error
    for err := range errCh {
        errors = append(errors, err)
    }

    if len(errors) > 0 {
        fmt.Println("汇总错误:")
        for _, err := range errors {
            fmt.Println(err)
        }
    } else {
        fmt.Println("所有任务均成功完成")
    }
}

在上述代码中:

  1. task 函数模拟一个任务,它接收任务编号、WaitGroup 指针和错误通道。任务完成后,通过 wg.Done() 通知 WaitGroup 任务已完成。如果任务失败,向错误通道发送错误。
  2. main 函数中,创建 WaitGroup 和错误通道,并启动多个 goroutine 执行任务。
  3. 使用一个 goroutine 等待所有任务完成后关闭错误通道。
  4. 主 goroutine 从错误通道接收错误并汇总到 errors 切片中,最后根据是否有错误输出相应信息。这种方法在性能和资源消耗方面较为平衡,能够有效捕获和汇总所有 goroutine 中的错误。