Go語言學習筆記 Go協程

2021-09-29 03:46:04 字數 1425 閱讀 8400

併發(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的包的前面...