併發(concurrency)是指一次處理大量事情的能力。讓我們用乙個例子來說明。
並行(parallelism)指的是同時處理多個事情。雖然聽起來像併發,
但是它們是不同的。
go 原生支援併發。在go中,使用 go 協程(goroutine)和通道 (channel)來處理併發。 函式 main 就以 goroutine 運 。另有與之配套的channel 型別, 以實現 "以通訊來共享記憶體" 的 csp 模式。一、建立協程排程器不能保證多個 goroutine 執行次序,且程序退出時不會等待它們結束。
func hello()
func main()
1.go hello()開啟乙個新協程,現在 hello() 函式將和 main() 函式一起執行。main 函式在單獨的協程中執行,這個協程稱 為主協程。
2.在主協程存在時才能執行其他協程,主協程終止則程式終止,其他協程也將終止。
3.這段**不會列印hello裡的字串,因為主協程執行完的時候hello()協程還沒執行完。
運用time包的sleep解決上述問題:
在主協程中使用 sleep 函式等待其他協程結束的方法是不正規的, 我們用在這裡只是為了說明go協程是如何工作的
func main()
二、開啟多個協程package main
import(
"fmt"
"time"
)func numbers()
}func alphabets()
}func main()
三、runtime.goexit終止goroutine執行
func main() ()
println("a") //不會執行
wg.wait()
}//defer延遲呼叫仍然執行
四、waitgroup
「三」中**涉及的sync包的waitgroup
waitgroup 用於等待一批 go 協程執行結束。程式控制會一直阻塞,直到這些協程全部執行完畢。waitgroup是乙個結構體,初始值為零,使用計數器工作。
func process(i int, wg *sync.waitgroup)
func main()
wg.wait() //計數為0時主協程解除阻塞 往下執行
fmt.println("all go routines finished executing")
}
go語言學習(3) 協程
現在主流os呼叫粒度為執行緒,產生時鐘中斷後,中斷處理函式,如果當前執行緒時間片使用完畢。則切換到其他的執行緒,資源開銷很大。還有建立和銷毀執行緒是和很消耗執行緒資源的。特別是對於我們後台程式開發,為了減少不必要的效能開銷,廣泛採用 池 進行維護。go語言語言級別支援協程。使用關鍵字go,如下 fu...
go語言學習(5)協程
goroutine的定義 1.任何函式只需加上go就能送給排程器執行 2.不需要在定義時區分是否是非同步函式 3.排程器在合適的點進行切換 4.使用 race來檢測資料訪問衝突 goroutine可能的切換點 1.i o select 2.channel 3.等待鎖 4.函式呼叫 5.runtime...
go語言學習筆記
type info struct func main fmt.println info1 data,json.marshal info1 fmt.println string data 輸出 這裡要特別注意的是 json 冒號後面和雙引號之間千萬不要有空格!被坑慘了 go語言 import的包的前面...