Goroutine的使用
设置goroutine运行的CPU数量,最新版本的go已经默认已经设置了。
num := runtime.NumCPU() //获取主机的逻辑CPU个数
runtime.GOMAXPROCS(num) //设置可同时执行的最大CPU数
应用示例:
package main
import (
"fmt"
"time"
)
func count(a int , b int ) {
c := a+b
fmt.Printf("%d + %d = %d\n",a,b,c)
}
func main() {
for i :=0 ; i<10 ;i++{
go count(i,i+1) //启动10个goroutine 来计算
}
time.Sleep(time.Second * 3) // sleep作用是为了等待所有任务完成
}
由于goroutine是异步执行的,那很有可能出现主程序退出时还有goroutine没有执行完,此时goroutine也会跟着退出。此时如果想等到所有goroutine任务执行完毕才退出,go提供了sync包和channel来解决同步问题,当然如果你能预测每个goroutine执行的时间,你还可以通过time.Sleep方式等待所有的groutine执行完成以后在退出程序。
- 使用sync包同步goroutine
sync实现方式是:
WaitGroup 等待一组goroutinue执行完毕. 主程序调用 Add 添加等待的goroutinue数量. 每个goroutinue在执行结束时调用 Done ,此时等待队列数量减1.,主程序通过Wait阻塞,直到等待队列为0.
应用示例:
package main
import (
"fmt"
"sync"
)
func count(a ,b int,n *sync.WaitGroup){
c := a +b
fmt.Printf("The Result of %d + %d=%d\n",a,b,c)
defer n.Done() //goroutinue完成后, WaitGroup的计数-1
}
func main(){
var wg sync.WaitGroup
for i:=0;i<10 ;i++{
wg.Add(1) // WaitGroup的计数加1
go count(i,i+1,&wg)
}
wg.Wait() //等待所有goroutine执行完毕
}
运行
The Result of 9 + 10=19
The Result of 7 + 8=15
The Result of 8 + 9=17
The Result of 5 + 6=11
The Result of 0 + 1=1
The Result of 1 + 2=3
The Result of 2 + 3=5
The Result of 3 + 4=7
The Result of 6 + 7=13
The Result of 4 + 5=9
通过channel实现goroutine之间的同步:
通过channel能在多个groutine之间通讯,当一个goroutine完成时候向channel发送退出信号,等所有goroutine退出时候,利用for循环channe去channel中的信号,若取不到数据会阻塞原理,等待所有goroutine执行完毕,使用该方法有个前提是你已经知道了你启动了多少个goroutine。
package main
import (
"fmt"
"time"
)
func count(a int , b int ,exitChan chan bool) {
c := a+b
fmt.Printf("The Result of %d + %d = %d\n",a,b,c)
time.Sleep(time.Second*2)
exitChan <- true
}
func main() {
exitChan := make(chan bool,10) //声明并分配管道内存
for i :=0 ; i<10 ;i++{
go count(i,i+1,exitChan)
}
for j :=0; j<10; j++{
<- exitChan //取信号数据,如果取不到则会阻塞
}
close(exitChan) // 关闭管道
}
运行:
The Result of 9 + 10 = 19
The Result of 0 + 1 = 1
The Result of 7 + 8 = 15
The Result of 6 + 7 = 13
The Result of 3 + 4 = 7
The Result of 4 + 5 = 9
The Result of 1 + 2 = 3
The Result of 2 + 3 = 5
The Result of 8 + 9 = 17
The Result of 5 + 6 = 11