go語言學習筆記22 Go語言併發程式設計

2021-08-27 05:54:44 字數 2813 閱讀 1365

goroutine是go語言並行設計的核心,有人稱之為go程。 goroutine說到底其實就是協程,它比執行緒更小,十幾個goroutine可能體現在底層就是五六個執行緒,go語言內部幫你實現了這些goroutine之間的記憶體共享。執行goroutine只需極少的棧記憶體(大概是4~5kb),當然會根據相應的資料伸縮。也正因為如此,可同時執行成千上萬個併發任務。goroutine比thread更易用、更高效、更輕便。

一般情況下,乙個普通計算機跑幾十個執行緒就有點負載過大了,但是同樣的機器卻可以輕鬆地讓成百上千個goroutine進行資源競爭。

只需在函式調⽤語句前新增 go 關鍵字,就可建立併發執⾏單元。開發⼈員無需了解任何執⾏細節,排程器會自動將其安排到合適的系統執行緒上執行。

在併發程式設計中,我們通常想將乙個過程切分成幾塊,然後讓每個goroutine各自負責一塊工作,當乙個程式啟動時,主函式在乙個單獨的goroutine中執行,我們叫它main goroutine。新的goroutine會用go語句來建立。而go語言的併發設計,讓我們很輕鬆就可以達成這一目的。

示例:

package main

import (

"fmt"

)func task()

}func main()

}//輸出結果

//**********=new主go程正在列印,i=1

//new子go程正在列印,i=1

//new子go程正在列印,i=2

//**********=new主go程正在列印,i=2

//new子go程正在列印,i=3

//**********=new主go程正在列印,i=3

//**********=new主go程正在列印,i=4

//new子go程正在列印,i=4

//new子go程正在列印,i=5

//**********=new主go程正在列印,i=5

//**********=new主go程正在列印,i=6

//new子go程正在列印,i=6

//new子go程正在列印,i=7

//**********=new主go程正在列印,i=7

//**********=new主go程正在列印,i=8

//new子go程正在列印,i=8

//new子go程正在列印,i=9

//**********=new主go程正在列印,i=9

//**********=new主go程正在列印,i=10

//new子go程正在列印,i=10

//new子go程正在列印,i=11

//**********=new主go程正在列印,i=11

//......

goroutine特性

主goroutine退出後,其它的工作goroutine也會自動退出:

例項如下:

package main

import (

"fmt"

)func task()

}func main()

//輸出結果

//new子go程正在列印,i=1

//new子go程正在列印,i=2

//**********=new主go程正在列印

//process finished with exit code 0

常用:runtime包

gosched

runtime.gosched() (go schedule)用於讓出cpu時間片,讓出當前goroutine的執行許可權,排程器安排其他等待的任務執行,並在下次再獲得cpu時間輪片的時候,從該出讓cpu的位置恢復執行。

有點像跑接力賽,a跑了一會碰到**runtime.gosched() 就把接力棒交給b了,a歇著了,b繼續跑。

示例**:

package main

import (

"fmt"

"runtime"

)func main()

}("hello")

for i :=0; i <3; i++

}//沒有使用runtime.gosched()時:

//hello

//hello

//hello

//world

//world

//world

//使用runtime.gosched()時:

//hello

//hello

//hello

//hello

//world

//hello

//world

//world

以上程式的執行過程如下:

主協程進入main()函式,進行**的執行。當執行到go func()匿名函式時,建立乙個新的協程,開始執行匿名函式中的**,主協程繼續向下執行,執行到runtime.gosched( )時會暫停向下執行,直到其它協程執行完後,再回到該位置,主協程繼續向下執行。

goexit

呼叫 runtime.goexit() 將立即終止當前 goroutine 執⾏,排程器確保所有已註冊 defer 延遲呼叫被執行。

示例**:

package main

import (

"fmt"

"runtime"

)func main() ()

fmt.println("654321")

}()//死迴圈,目的不讓主goroutine結束

for}

//輸出結果

//aaaaaa

//bbbbbb

22《Go語言入門》型別斷言

這是我純手寫的 go語言入門 手把手教你入門go。原始碼 文章,看了你就會?此處應有掌聲?文章中所有的 我都放到了github.com ganzhixiong go learning這個倉庫中。在看文章的時候,對照倉庫中 學習效果更佳!nil介面變數無論斷言什麼型別都會失敗 判斷介面值是否有某乙個或...

go語言學習筆記

type info struct func main fmt.println info1 data,json.marshal info1 fmt.println string data 輸出 這裡要特別注意的是 json 冒號後面和雙引號之間千萬不要有空格!被坑慘了 go語言 import的包的前面...

Go語言 學習筆記

import 下劃線 如 import hello imp 的作用 當匯入乙個包時,該包下的檔案裡所有init 函式都會被執行,然而,有些時候我們並不需要把整個包都匯入進來,僅僅是是希望它執行init 函式而已。這個時候就可以使用 import 引用該包。即使用 import 包路徑 只是引用該包,...