@
linjunyi22 感谢, 刚学习 go,有一些概念改搞不清。但是你这种方法好像会造成接收不完全就会退出。我自己也解决了这个问题了。
```
package main
import (
"context"
"fmt"
"math/rand"
"sync"
"time"
)
var (
wg = sync.WaitGroup{} // 用于计数, 让程序正常执行,不会主函数执行完子函数还没执行。计数清 0 则不用等待
a int
//lock sync.Mutex
rwlock sync.RWMutex
icons map[string]string
loadIconsOnce sync.Once
//m sync.Map
)
func randNumber(x int64) int64 {
var sum int64 = 0
for x > 0 {
a := x % 10
x = x / 10
sum += a
}
return sum
}
func main() {
wg.Add(25)
defer wg.Wait()
var maxSend = 10
var jobChan = make(chan int64, 10)
var resultChan = make(chan int64, 10)
var lock sync.Mutex
ctx, cancel := context.WithCancel(context.Background())
//var once sync.Once
go func(jobChan chan<- int64, ) {
for i:=0;i<maxSend;i++{
rand.Seed(time.Now().UnixNano())
jobChan <- rand.Int63n(100)
}
close(jobChan)
wg.Done()
}(jobChan)
count1 := 1
for i:=0;i<24;i++{
go func(jobChan <-chan int64, resultChan chan int64, ctx context.Context) {
defer wg.Done()
for num:= range jobChan{
select {
case <- ctx.Done():
return
case resultChan <- randNumber(num):
lock.Lock()
fmt.Println("count:", count1)
count1 += 1
lock.Unlock()
}
}
}(jobChan, resultChan, ctx)
}
num := maxSend
count := 1
for value := range resultChan {
if num == 1 {
fmt.Printf("key:%v, value:%v\n", count, value)
cancel()
return
}else {
num -= 1
fmt.Printf("key:%v, value:%v\n", count, value)
count += 1
}
}
}
```