I ### 一个简单的工作池
package main
import (
"fmt"
"math/rand"
"sync"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
go producer(jobChan)
wg.Add(20)
for i := 0; i < 20; i++ {
go consumer(jobChan, resultChan)
}
for v := range resultChan {
fmt.Println(v)
}
}
type Result struct {
sum int64
job *Job
}
type Job struct {
value int64
}
var jobChan = make(chan *Job, 100)
var resultChan = make(chan *Result, 100)
func producer(jobChan chan<- *Job) {
defer wg.Done()
defer close(jobChan)
for {
newJob := &Job{
value: rand.Int63(),
}
jobChan <- newJob
}
}
func consumer(jobChan <-chan *Job, resultChan chan<- *Result) {
defer wg.Done()
defer close(resultChan)
for {
sum := int64(0)
job := <-jobChan
sum = job.value * job.value
res := &Result{
sum: int64(sum),
job: job,
}
resultChan <- res
}
}