雅勳
直接的回答是:Golang是基於多線程模型的。
Golang有一個環境變量GOMAXPROCS,決定了Go運行庫最多會啟動幾個線程來運行goroutine。
但在Golang中沒有線程的概念,用的是協程,即goroutine。
先看一下進程、線程、協程這幾個概念:
進程:分配完整獨立的地址空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程的切換隻發生在內核態,由操作系統調度。
線程:和其它本進程的線程共享地址空間,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程的切換一般也由操作系統調度。
協程:和線程類似,共享堆,不共享棧,協程的切換由Go的調度器來進行調度。
所以,一個Go程序是一個進程,進程裡有數個線程,進程裡還有數個協程,一個或幾個協程對應一個線程。
講解GO線程模型的一般用這樣幾個符號:
M: OS線程
P: goroutin所必須的上下文環境
G: goroutin
調度器: 管理和調度 M, P, G
從關係上可以看下圖:
一個OS線程和一個上下文綁定,一個上下文可以掛幾個協程,由Go調度器來分配、調度他們。