首页 > 解决方案 > 有界并发的最简单并发循环

问题描述

我正在寻找用于并行循环数据集的最简单代码。要求是 goroutine 的数量是固定的,并且它们可以返回错误代码。以下是一个不起作用的快速尝试,因为两个 goroutine 都阻塞在错误通道上,循环将死锁

package main

import (
        "fmt"
        "sync"
)


func worker(wg *sync.WaitGroup, intChan chan int, errChan chan error) {
        defer wg.Done()

        for i := range intChan {
                fmt.Printf("Got %d\n", i)
                errChan <- nil
        }
}

func main() {
        ints := []int{1,2,3,4,5,6,7,8,9,10}

        intChan := make(chan int)
        errChan := make(chan error)
        wg := new(sync.WaitGroup)

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

        for i := range ints {
                intChan <- i
        }

        for range ints {
                err := <- errChan
                fmt.Printf("Error: %v\n", err)
        }

        close(intChan)
        wg.Wait()
}

这样做的最简单模式是什么?

标签: go

解决方案


监听 goroutine 中的错误:

go func() {
  for err:=range errChan {
    // Deal with err
  }
}()

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

for i := range ints {
  intChan <- i
}
close(errChan) // Error listener goroutine terminates after this

推荐阅读