1.查看cpu和设置并发
package main import ( "fmt" "runtime" ) func main(){ n := runtime.NumCPU() //查看物理机cpu数量 runtime.GOMAXPROCS(n) //设置使用多少cpu,也就是多少个p fmt.Println(n) //4 }
2.不一样goroutine之间如何进行同步函数
出现问题场景:出现问题场景: 一个函数run()中包含多个goroutine函数并发,这些goroutine函数会生成中间文件, 被run()函数运行结束后的check()函数检查. 当goroutine并发时, 并不会阻塞run()的上下文, 可能致使的状况为run()函数执行完毕( 但其中的goroutine并发函数没有执行完毕 ), 致使check()函数执行失败.blog
因此咱们须要一种操做, 直到当前全部goroutine执行完毕, 才进行下一步操做,因此须要 goroutine同步同步
1)全局变量和锁同步it
package main import( "fmt" "time" ) func calc() { for i := 0; i < 1000; i++ { time.Sleep(time.Millisecond) } } func main() { start := time.Now().UnixNano() go calc() go calc() go calc() end := time.Now().UnixNano() fmt.Printf("finished, cost:%d ms\n", (end - start)/1000/1000) // finished,cost:0 ms }
上面的例子品输出的是0ms,由于每一个goroutine并无阻塞主函数main()的运行,主函数结束了,而其它goroutine可能还在运行,看下面的改变,利用全局变量来等待全部的goroutine执行完成class
package main import( "fmt" "time" ) var iscomp [3]bool //设置全局变量 func calc(index int) { for i := 0; i < 1000; i++ { time.Sleep(time.Millisecond) } iscomp[index] = true } func main() { start := time.Now().UnixNano() go calc(0) //每启用一个,就改变量的值 go calc(1) go calc(2) for { //死循环 等待全部的goroutine执行完成 if iscomp[0] && iscomp[1] && iscomp[2] { break } time.Sleep(time.Millisecond) } end := time.Now().UnixNano() fmt.Printf("finished, cost:%d ms\n", (end - start)/1000/1000) //finished, cost:1080 ms }
go语言里提供了一个sync包来等待全部的goroutine执行完成,import
package main import( "fmt" "time" "sync" ) // var iscomp [3]bool //设置全局变量 func calc(waitgroup *sync.WaitGroup) { for i := 0; i < 1000; i++ { time.Sleep(time.Millisecond) } waitgroup.Done() // iscomp[index] = true } func main() { var waitgroup sync.WaitGroup //申明一个变量 start := time.Now().UnixNano() waitgroup.Add(3) go calc(&waitgroup) go calc(&waitgroup) go calc(&waitgroup) //每启用一个,增长一个,或者改为如下代码: /* for i:= 0;i<3;i++{ waitgroup.Add(1) go calc(&waitgroup) } */ // for { //死循环 等待全部的goroutine执行完成 // if iscomp[0] && iscomp[1] && iscomp[2] { // break // } // time.Sleep(time.Millisecond) // } waitgroup.Wait() end := time.Now().UnixNano() fmt.Printf("finished, cost:%d ms\n", (end - start)/1000/1000) //finished, cost:1080 ms }
2)channel(看下一篇channel)变量