1、多个独立任务
package main
import (
"fmt"
"runtime"
)
/**
并发多个独立的任务
*/
func main() {
//处理任务的goroutine 数量(处理任务数量,和等待所有的goroutine处理完毕微循环数量一致)
workers := runtime.NumCPU()
//使用最大的cup数
runtime.GOMAXPROCS(workers)
//任务通道,所有的任务发往此通道
jobs := make(chan int, workers)
//完成chan,当任务处理完毕时,往此chan发送一个数据。用于监听所有的goroutine都执行完毕,数据类型没有要求
done := make(chan bool, workers)
//创建一个gotoutine,用于生成任务
go generateJob(jobs)
//处理任务
processJob(done, jobs, workers)
//等待所有goroutine 执行完毕
waitUntil(done, workers)
}
/**
生成任务
jobs chan 为只接收chan
*/
func generateJob(jobs chan<- int) {
for i := 1; i <= 10; i++ {
jobs <- i
}
//所有数据发送完毕后关闭通道。此方法只是告诉使用此通道的地方,此通道中已经不再发送数据了,并没有真正的关闭。
close(jobs)
}
/**
处理任务
只向done chan 中发送数据
只从jobs chan 中接收数据
workers 创建goroutine 数量
*/
func processJob(done chan<- bool, jobs <-chan int, workers int) {
for i := 0; i < workers; i++ {
go func() {
//当前jobs chan 中没有数据时阻塞,直到调用close(jobs)方法,或者有数据
for job := range jobs {
//处理任务
fmt.Println(job)
}
//此goroutine执行完毕,done 中存放标识
done <- true
}()
}
}
//等待所有的goroutine 执行完毕
func waitUntil(done <-chan bool, workers int) {
for i := 0; i < workers; i++ {
<-done
}
}
说明:
1)、处理任务的goroutine 数量和等待所有goroutine执行完毕循环(waitUntil方法)次数一致,为:workers数