func main() {
fmt.Println(runtime.NumCPU()) //这里可以看到我的cpu核数,利用多核运行程序
runtime.GOMAXPROCS(runtime.NumCPU()) //利用多核进行运行程序,当使用go时非阻塞时,执行顺序是随机的
//不均匀,为了防止某些步骤未执行完毕main函数就退出需要配合另外一个包sync或者通过缓存通道
//例如程序需要执行十次,那么每次存入一个值,外部用取到十次值才退出
s := sync.WaitGroup{}
s.Add(10) //增加十个任务
for i := 0; i < 10; i += 1 {
ww(&s, i)
}
s.Wait() //等待十次任务清除才会继续下面的动作
c := make(chan bool) //这是双向通道,还有一种是单项通道只可以取或存
go Test(c) //goroutine关键字,由官方实现的一个超级线程池
//通过通信(通道)来实现共享内存channel。这里又讲到时间切片的概念,在多进程中也讲到过
fmt.Println(1) //这里并非按照顺序执行,有可能Test函数先执行,如果将通道放置上一行,则是阻塞的操作
<-c //遇到这一行则会等待Test返回才会执行下一句
//可以通过for range迭代这个通道,就会一直等待通道存入值信号,要用close关闭这个通道
//通道缓存概念:make(chan bool 1)创建一个容量为1的通道,有缓存为异步的,无缓存是阻塞的
//可以简单的理解为通道已经有个东西了,只要读就能读到东西,无缓存理解为通道没有东西,没有读到就会一直等待
//
}
func Test(c chan bool) { //这里传递一个通道参数需要三个
fmt.Println("go go go !!!")
c <- true
}
func ww(s *sync.WaitGroup, i int) {
fmt.Println(i)
s.Done() //清除一次
}
原文链接:并发concurrency-GOLANG
有疑问加站长微信联系(非本文作者)