Go之併發
阿新 • • 發佈:2020-10-18
package main import "fmt" import "sync" var wg sync.WaitGroup // 互斥鎖 var lock sync.Mutex func main(){ // 開啟一個主goroutine來執行main函式 // Go語言併發通過goroutine實現 // goroutine類似於執行緒,屬於使用者態的執行緒 // 我們可以根據需要建立成千上萬個goroutine併發工作 // goroutine是Go語言的執行時排程完成,而執行緒是由作業系統排程完成 // Go語言還提供channel在多個goroutine間通訊 // goroutine 和 channel是Go語言秉承的CSP併發模式的重要實現基礎 count := 0 for i := 0; i < 1000; i++ { wg.Add(1) // 計數牌+1 go hello(i, &count) // 開啟一個goroutine來執行hello這個函式 } wg.Wait() // 阻塞,等所有小兵都幹完活才收兵 fmt.Println("count", count) // 100000 } func hello(num int, count *int){ for i := 0; i < 100; i++ { // 加鎖 lock.Lock() *count++ // 釋放鎖 lock.Unlock() fmt.Println("hello", num, i) } wg.Done() // 通知wg把計數牌-1 }