Go語言 併發程式設計goroutine

2021-10-08 01:55:00 字數 1518 閱讀 2787

在go語言中併發是通過goroutine實現。goroutine類似於執行緒,屬於使用者態執行緒。go語言也可以通過channel(管道)與多個goroutine進行通訊。

goroutine類似於執行緒,在go語言中底層分配了乙個執行緒池,因此不需要我們對其進行管理,由go執行時的routine進行排程。

在go語言中實現goroutine非常簡單,只需要在呼叫函式前加上go關鍵字,就可以為該函式建立乙個goroutine。因此乙個goroutine對應乙個函式,多個goroutine可以對應多個函式。

//序列執行

package main

import

"fmt"

func

hello()

func

main()

上述**是序列執行,執行完乙個函式以後才會執行下乙個語句,如果想讓其能夠併發執行,就需要goroutine

func

main()

只需要在呼叫具體函式的時候,加上乙個go關鍵字即可。

加上關鍵字以後,在呼叫具體方法的時候,就不需要主線程進行呼叫,主線程會繼續往下執行,主線程於子執行緒併發執行。因此執行出來的結果不同。

如果想讓全部執行結束以後,再返回。

func

main()

package main

import

("fmt"

"sync"

)var sy sync.waitgroup

func

hello()

func

main()

同時goroutine也可以使用匿名函式,但是再使用匿名函式的時候,容易產生閉包的問題,需要注意。

gomaxprocs設定使用cpu核心數

在go1.5版本之前預設使用的是單核操作,在1.5版本後預設使用cpu全部核心進行操作,能夠充分利用硬體資源。

//使用方法

runtine.

gomaxprocs

(核心數)

package main

import

("fmt"

"sync"

"runtime"

)var wg sync.waitgroup

func

hello()

func

helloworld()

func

main()

乙個作業系統執行緒對應多個使用者態goroutine

go語言程式可以同時使用多個作業系統執行緒

goroutine於os執行緒是多對多的關係

go語言併發程式設計

協程 coroutine 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現中寄存於執行緒中,系統開銷極小。package main import fmt func count ch chan int,i int func main for ch range chs chan...

Go語言併發程式設計(二)

使用非常簡單,在函式前增加乙個go 例 go f a,b 開啟後,不等待其結束,主線程繼續執行。ps 要注意的是乙個goroutine開啟後,若不等其執行,main 主goroutine 中將繼續執行下一步,那麼主線程一結束,goroutine中的程式就不會執行了。如何解決?如下 func says...

Go語言併發程式設計 讀寫鎖

通過對互斥鎖的學習,我們已經了解了鎖的概念及用途。主要用於處理併發中的臨界資源問題。rwmutex是基於mutex實現的,唯讀鎖的實現使用類似引用計數器的功能。rwmutext是讀 寫互斥鎖。鎖可以由任意數量的讀取器或單個編寫器持有。rwmutex的零值是未鎖定的mutex。當有乙個goroutin...