多协程并发运行收集错误信息
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func job(id int) (string, error) {
rand.Seed(time.Now().UnixNano())
time.Sleep(time.Millisecond)
randNum := rand.Intn(1000)
if randNum%2 == 0 {
return "", fmt.Errorf("发生错误,ID=%d,RandNum=%d", id, randNum)
}
return fmt.Sprintf("成功结果,ID=%d", id), nil
}
func printErrChan() {
errChan := make(chan error)
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(index int) {
defer wg.Done()
_, err := job(index)
if err != nil {
errChan <- err
}
}(i)
}
go func() {
defer close(errChan)
wg.Wait()
}()
count := 0
for item := range errChan {
fmt.Println(item)
count++
if count == 2 {
break
}
}
}
func printAllChan() {
retChan := make(chan interface{})
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(index int) {
defer wg.Done()
ret, err := job(index)
if err != nil {
retChan <- err
} else {
retChan <- ret
}
}(i)
}
go func() {
defer close(retChan)
wg.Wait()
}()
count := 0
for item := range retChan {
if err,ok := item.(error);ok{
fmt.Println("ErrorInfo:",err.Error())
count++
}else{
fmt.Println("SuccessInfo:",item)
}
fmt.Println(item)
if count == 2 {
break
}
}
}
func main() {
printAllChan()
}
最后更新于