MST

星途 面试题库

面试题:Go语言Goroutine错误处理与并发安全

假设你有多个Goroutine并发执行任务,每个Goroutine都可能产生错误。请描述一种能有效收集所有Goroutine错误且保证并发安全的设计方案,并使用Go代码实现。
32.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 设计方案描述
    • 使用一个带缓冲的 chan error 来收集各个 Goroutine 产生的错误。
    • 使用 sync.WaitGroup 来等待所有 Goroutine 完成。
    • 为了保证并发安全,每个 Goroutine 只向 chan error 发送错误,在主 Goroutine 中统一从 chan error 接收错误并处理。
  2. Go代码实现
package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup, errChan chan error) {
    defer wg.Done()
    // 模拟可能出错的任务
    if id%2 == 0 {
        errChan <- fmt.Errorf("worker %d encountered an error", id)
    } else {
        fmt.Printf("worker %d completed successfully\n", id)
    }
}

func main() {
    var wg sync.WaitGroup
    errChan := make(chan error, 10)

    numWorkers := 5
    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go worker(i, &wg, errChan)
    }

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

    for err := range errChan {
        fmt.Println(err)
    }
}