一旦遇到错误,我想停止从通道读取数据.我认为我需要使用errroup.WithContext(),但我不能完全理解如何集成它.
以下是输出:
Thread 2: STARTED
Thread 1: STARTED
Thread 0: STARTED
Thread 2: GOT=0
Thread 1: GOT=1
Thread 0: GOT=2
Thread 0: FAILED
Thread 1: GOT=3
Thread 2: GOT=4
Thread 2: GOT=5
Thread 1: GOT=6
Thread 1: GOT=7
Thread 2: GOT=8
panic: Thread 0: FAILED
package main
import (
"fmt"
"time"
"golang.org/x/sync/errgroup"
)
func main() {
const threads = 3
ch := make(chan int, threads)
eg := errgroup.Group{}
for i := 0; i < threads; i++ {
i := i
eg.Go(func() error {
fmt.Printf("Thread %d: STARTED\n", i)
for n := range ch {
fmt.Printf("Thread %d: GOT=%d\n", i, n)
time.Sleep(time.Duration(1) * time.Second)
// Simulate failed thread
if n == 2 {
fmt.Printf("Thread %d: FAILED\n", i)
return fmt.Errorf("Thread %d: FAILED", i)
}
}
return nil
})
}
for i := 0; i < 9; i++ {
ch <- i
}
close(ch)
if err := eg.Wait(); err != nil {
panic(err)
}
}
.....................................................................................