funcallocate(noOfJobs int) { for i :=0; i < noOfJobs; i++ { randomno := rand.Intn(999) job :=Job{i, randomno} jobs <- job }close(jobs)}
函数allocate创建的任务写入带缓存channel,完成所有的任务写入后关闭该channel。
接着我们创建一个函数来读取results channel中的计算结果并打印:
funcresult(done chanbool) { for result :=range results { fmt.Printf("Job id %d, input random no %d , sum of digits %d\n", result.job.id, result.job.randomno, result.sumofdigits)
} done <-true}
packagemainimport ( "fmt""math/rand""sync""time")typeJobstruct { id int randomno int}typeResultstruct { job Job sumofdigits int}var jobs =make(chanJob, 10) var results =make(chanResult, 10)funcdigits(number int) int { sum :=0 no := numberfor no !=0 { digit := no %10 sum += digit no /=10 } time.Sleep(2* time.Second)return sum}funcworker(wg *sync.WaitGroup) { for job :=range jobs { output :=Result{job, digits(job.randomno)} results <- output } wg.Done()}funccreateWorkerPool(noOfWorkers int) { var wg sync.WaitGroupfor i :=0; i < noOfWorkers; i++ { wg.Add(1)goworker(&wg) } wg.Wait()close(results)}funcallocate(noOfJobs int) { for i :=0; i < noOfJobs; i++ { randomno := rand.Intn(999) job :=Job{i, randomno} jobs <- job }close(jobs)}funcresult(done chanbool) { for result :=range results { fmt.Printf("Job id %d, input random no %d , sum of digits %d\n", result.job.id, result.job.randomno, result.sumofdigits)
} done <-true}funcmain() { startTime := time.Now() noOfJobs :=100goallocate(noOfJobs) done :=make(chanbool)goresult(done) noOfWorkers :=10createWorkerPool(noOfWorkers)<-done endTime := time.Now() diff := endTime.Sub(startTime) fmt.Println("total time taken ", diff.Seconds(), "seconds")}
在我的机器上执行结果如下:
Job id 2, input random no 407 , sum of digits 11
Job id 0, input random no 878 , sum of digits 23
Job id 9, input random no 150 , sum of digits 6
...
total time taken 20.022653316 seconds