course/Concurrency/work_pool_practice.go

66 lines
1.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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()
}