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)變量