course/Concurrency/work_pool_practice.go

66 lines
1.3 KiB
Go
Raw Normal View History

package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
//使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序例如生成随机数61345计算其每个位数上的数字之和为19。
//开启一个 goroutine 循环生成int64类型的随机数发送到jobChan
//开启24个 goroutine 从jobChan中取出随机数计算各位数的和将结果发送到resultChan
//主 goroutine 从resultChan取出结果并打印到终端输出
var w sync.WaitGroup
type job struct {
value int64
}
type Result struct {
job *job
sum int64
}
var jobChan = make(chan *job, 100)
var resultChan = make(chan *Result, 100)
func producer(prod chan<- *job) <-chan *job {
defer w.Done()
for {
x := rand.Int63()
newJob := &job{value: x}
jobChan <- newJob
time.Sleep(time.Millisecond * 500)
}
}
func consumer(con chan<- *Result, prod <-chan *job) {
defer w.Done()
for {
v := <-prod
sum := int64(0)
n := v.value
for n > 0 {
sum += n % 10
n = n / 10
}
newResult := &Result{job: v, sum: sum}
con <- newResult
}
}
func main() {
w.Add(1)
go producer(jobChan)
w.Add(24)
for i := 0; i < 24; i++ {
go consumer(resultChan, jobChan)
}
for i := range resultChan {
fmt.Printf("随机数为:%d,加和为:%d\n", i.job.value, i.sum)
}
w.Wait()
}