goroutine(協程)。
程序、執行緒?
程序,執行緒都是os層面的系統排程方式。
協程是使用者層面的呼叫方式,利用更少的資源進行切換,而不需要system call。
但協程是呼叫的os的執行緒在執行。
當乙個函式為def abc()時,使用go abc() 即為開乙個協程去呼叫這個函式
goroutine在遇到檔案i/o的時候,(執行緒和goroutine會與邏輯處理器)會分隔開,然後os新建立乙個執行緒,將其繫結這個邏輯處理器接著執行,當之前的系統呼叫執行完成的時候,那個goroutine會放到等到佇列,執行緒也會儲存好,等待下次使用。
網路i/o稍有不同。網路i/o中,goroutine會與邏輯處理器分離,一旦該輪詢器指示的某個網路讀/網路寫完成後,goroutine就會繫結對應的邏輯處理器來出來,處理完後又分離。
看起來執行緒池與協程有點像?,看下面的解釋。
(協程在對堆上分配堆疊~,跟常見的上下文切換,棧儲存資訊有挺大區別)
協程在上下文切換的時候,資訊儲存在goroutine中。
go的csp併發模型:
1、多執行緒共享記憶體。
2、通訊的方式共線資料。
goroutine在排程器排程的時候,也會出現防餓死而轉到另乙個goroutine的情況
package main
import (
"fmt"
"runtime"
"sync"
"time"
)func general_func()
func nice()
func main()
}}() //這裡加個括號是閉包函式的使用,意思為直接呼叫該函式。
go func()
}}() //這裡加個括號是閉包函式的使用,意思為直接呼叫該函式。
//sleep 2s
time.sleep(time.duration(2)*time.second) //如果不加這句話,也沒有wg.wait,有可能goroutine直接跑完而不顯示上面的字元了
fmt.println("it sound good")
}
同步goroutine的原子函式:
原子函式底層通過加鎖的訪問,還挺神奇。
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic"
)//define 多個變數
var (
counter int64
wg sync.waitgroup
)func inccounter(id int)
fmt.println(counter)
}func main()
類似的還有loadint64和storeint64,這兩個一起用來分別讀和寫,那麼不會進入競爭狀態,原子函式會保持同步
互斥鎖,跟其它語言一樣。
channel,用make建立,分為有緩衝和無緩衝。(buffer為了平衡讀寫差異,穩)
無緩衝channel需要讀寫均準備好,才會傳輸資料。(確保同時傳輸資料)
使用channel時,會處於阻塞狀態。
example:
/*
來自書本的乙個例子,兩個人玩球,分別從channel拿資料,當拿到channel被關閉時,其獲勝。
當其隨機數%x為0時,其失敗,並且close channel
*/package main
import (
"fmt"
"sync"
"math/rand"
)//define 多個變數
var (
counter int64
wg sync.waitgroup
)func play(name string,buffered chan int)
//生成乙個100內的隨機數
n := rand.intn(100)
if n%15==0
fmt.printf("player %s hit %d\n",name,ball) //打中的次數
ball++
buffered
}}func main()
對於有緩衝的buffer:
只有在目標buffer滿了,傳送端的channel才會阻塞;
只有在獲取的buffer滿了,讀動作的buffer才會阻塞;
golang開發 二 安裝 Golang
當然了我們的安裝都是在vagrant裡面安裝,vagrant ssh。不用虛擬機器了,本機安裝當然也可以。go is a tool for managing go source code.usage go command arguments the commands are build compil...
golang開發 二 安裝 Golang
當然了我們的安裝都是在vagrant裡面安裝,vagrant ssh。不用虛擬機器了,本機安裝當然也可以。go is a tool for managing go source code.usage go command arguments the commands are build compil...
golang多核的使用
實際上協程只是發生在單個程序內部的,要是想充分的發掘多核cpu的潛力,還是需要多程序的支援。對於多核程式設計,go是天生支援,那麼我們在什麼情況下應該用多核心來加速程式,而在什麼情況下用單核即可呢?現在我們用一簡單的程式來說明下 定義任務佇列 varwaitgroup sync waitgroup ...