package main
import (
"fmt"
"runtime"
)
var workers = runtime.NumCPU()
type result struct {
jobname string
resultcode int
resultinfo string
}
type job struct {
jobname string
results chan<- result
}
func main() {
jobnames := []string{"1", "2", "3", "4", "5", "6", "7", "8"}
dorequest(jobnames)
}
func dorequest(jobnames []string) {
jobs := make(chan job, workers)
results := make(chan result, len(jobnames))
done := make(chan struct{}, workers)
go func( jobs chan <- job, jobnames[]string, results chan <- result){
for _, jobname := range jobnames {
jobs <- job{jobname, results}
}
close(jobs)
}( jobs, jobnames, results)
for i := 0; i < workers; i++ {
go func( done chan <- struct{}, jobs <- chan job){
for job := range jobs {
job.do()
}
done <- struct{}{}
}( done, jobs)
}
go func( done <- chan struct{}, results chan result){
for i := 0; i < workers; i++ {
<-done
}
close(results)
}( done, results)
for result := range results {
fmt.Printf("done: %s,%d,%s\n", result.jobname, result.resultcode, result.resultinfo)
}
}
func (job job) do() {
fmt.Printf("... doing work in [%s]\n", job.jobname)
if job.jobname == "8" {
job.results <- result{job.jobname, 0, "ok"}
} else {
job.results <- result{job.jobname, -1, "error"}
}
}