首頁  >  文章  >  後端開發  >  golang異步是什麼

golang異步是什麼

青灯夜游
青灯夜游原創
2022-12-28 10:54:454257瀏覽

在golang中,非同步是指不依照程式碼順序執行,一個非同步過程的執行將不再與原有的序列有順序關係;在非同步中,當一個非同步過程呼叫發出後,呼叫者在沒有得到結果之前,就可以繼續執行後續操作。 golang非同步主要是由協程(goroutine)實現的;goroutine用來呼叫函數,當某個函數被go關鍵字呼叫後,go就會創造一個類似協程的東西,來執行這個函數,這樣可以輕易的實現並發。

golang異步是什麼

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

非同步是什麼?

非同步(Asynchronous, async)是與同步(Synchronous, sync)相對的概念。在我們學習的傳統單執行緒程式設計中,程式的運行是同步的(同步不意味著所有步驟同時運行,而是指步驟在一個控制流序列中按順序執行)。而非同步的概念則是不保證同步的概念,也就是說,一個非同步過程的執行將不再與原有的序列有順序關係。

 簡單來理解就是:同步以你的程式碼順序執行,非同步不依照程式碼順序執行,非同步的執行效率更高。

另一種解釋是:

給你兩個容器,一個叫同步,一個叫異步,把要執行的程式碼分別分到同步和非同步裡面,先執行同步同時異步待編譯,等同步執行完後執行異步裡面的程式碼。

golang怎麼實現非同步

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
[全部完成]

【相關推薦:Go影片教學程式教學

以上是golang異步是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn