go - 有界并发的最简单并发循环
问题描述
我正在寻找用于并行循环数据集的最简单代码。要求是 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()
}
这样做的最简单模式是什么?
解决方案
监听 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
推荐阅读
- loops - Lisp 中的子列表
- aws-lambda - 在哪里可以找到 AWS lambda 的 New Relic 上的 CPU 和内存利用率?
- typescript - 在多重继承中执行超类的所有构造函数
- flutter - Flutter 小部件测试在选择另一个项目时不会触发 DropdownButton.onChanged
- flask - 使用 Ssh 将文件从 Gitlab 复制到 EC2 (/www/html) 文件夹
- macos - 为什么我的 x86 链表函数会引发段错误?
- r - 如何在列之间循环以计算变量
- kotlin - 将 Object 的多个字段与 ArrayList of Objects 中的字段进行比较
- scala - Scala 3 / Dotty 中的依赖元组
- c# - 如何在 .NET Core 3.1 中使用自定义动作控制器?