您好,登錄后才能下訂單哦!
runtime 調度器是個非常有用的東西,關于 runtime 包幾個方法:
NumCPU
package main import ( "fmt" "runtime" ) func main() { fmt.Println("cpus:", runtime.NumCPU()) fmt.Println("goroot:", runtime.GOROOT()) fmt.Println("archive:", runtime.GOOS) }
運行結果:
GOMAXPROCS
Golang 默認所有任務都運行在一個 cpu 核里,如果要在 goroutine 中使用多核,可以使用 runtime.GOMAXPROCS 函數修改,當參數小于 1 時使用默認值。
package main import ( "fmt" "runtime" ) func init() { runtime.GOMAXPROCS(1) } func main() { // 任務邏輯... }
Gosched
這個函數的作用是讓當前 goroutine 讓出 CPU,當一個 goroutine 發生阻塞,Go 會自動地把與該 goroutine 處于同一系統線程的其他 goroutine 轉移到另一個系統線程上去,以使這些 goroutine 不阻塞
package main import ( "fmt" "runtime" ) func init() { runtime.GOMAXPROCS(1) //使用單核 } func main() { exit := make(chan int) go func() { defer close(exit) go func() { fmt.Println("b") }() }() for i := 0; i < 4; i++ { fmt.Println("a:", i) if i == 1 { runtime.Gosched() //切換任務 } } <-exit }
結果:
使用多核測試:
package main import ( "fmt" "runtime" ) func init() { runtime.GOMAXPROCS(4) //使用多核 } func main() { exit := make(chan int) go func() { defer close(exit) go func() { fmt.Println("b") }() }() for i := 0; i < 4; i++ { fmt.Println("a:", i) if i == 1 { runtime.Gosched() //切換任務 } } <-exit }
結果:
根據你機器來設定運行時的核數,但是運行結果不一定與上面相同,或者在 main 函數的最后加上 select{} 讓程序阻塞,則結果如下:
多核比較適合那種 CPU 密集型程序,如果是 IO 密集型使用多核會增加 CPU 切換的成本。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。