在golang中,非同步是指不依照程式碼順序執行,一個非同步過程的執行將不再與原有的序列有順序關係;在非同步中,當一個非同步過程呼叫發出後,呼叫者在沒有得到結果之前,就可以繼續執行後續操作。 golang非同步主要是由協程(goroutine)實現的;goroutine用來呼叫函數,當某個函數被go關鍵字呼叫後,go就會創造一個類似協程的東西,來執行這個函數,這樣可以輕易的實現並發。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
非同步(Asynchronous, async)是與同步(Synchronous, sync)相對的概念。在我們學習的傳統單執行緒程式設計中,程式的運行是同步的(同步不意味著所有步驟同時運行,而是指步驟在一個控制流序列中按順序執行)。而非同步的概念則是不保證同步的概念,也就是說,一個非同步過程的執行將不再與原有的序列有順序關係。
簡單來理解就是:同步以你的程式碼順序執行,非同步不依照程式碼順序執行,非同步的執行效率更高。
另一種解釋是:
給你兩個容器,一個叫同步,一個叫異步,把要執行的程式碼分別分到同步和非同步裡面,先執行同步同時異步待編譯,等同步執行完後執行異步裡面的程式碼。
Go的非同步主要是由協程(goroutine)實現的。協程相對於線程來說,佔用的記憶體更少,更輕量級,這也是Go在效能上的優勢。
Go 語言是一種同時程式語言,在 Go 裡有一個非常重要的關鍵字 go(goroutine),一般我們可以用它做一些非同步,並發的任務。
goroutine 用來呼叫函數,當某個函數被 go 關鍵字呼叫後,go 就會建立一個類似協程的東西,來執行這個函數,這樣可以輕易的實作並發。
範例:
package main import ( "fmt" ) func main() { go work1() go work2() fmt.Println("[全部完成]") } func work1(){ fmt.Println("work1") } func work2(){ fmt.Println("work2") }
結果:
[全部完成]
當然這是一個不恰當的範例,但這也證明了非同步執行,在呼叫work1,work2之後不等輸出結果,就繼續執行了。
要想等非同步執行完之後,再執行最後的輸出,需要加入WaitGroup
#正確範例:
package main import ( "fmt" "sync" ) var waitGroup sync.WaitGroup func main() { waitGroup.Add(2) go work1() go work2() waitGroup.Wait() fmt.Println("[全部完成]") } func work1(){ fmt.Println("work1") waitGroup.Done() } func work2(){ fmt.Println("work2") waitGroup.Done() }
結果:
work2 work1 [全部完成]
以上是golang異步是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!