在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...