goroutine(2) goroutine同步

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

相關文章
相關標籤/搜索