golang中的runtime
生活随笔
收集整理的這篇文章主要介紹了
golang中的runtime
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Gosched
runtime.Gosched()讓出cpu的時間片,讓出當前協程的執行權限,調度器安排其他等待的任務運行,并在下次某個時間從該位置恢復執行
和協程 yield 作用類似
func main() {go func() {for i := 0; i < 5; i++ {//不一定打印5次fmt.Println("go")}}() //別忘記()for i := 0; i < 2; i++ {//讓出我的時間片runtime.Gosched()fmt.Println("hello")} }Goexit
調用runtime.Goexit()將立即終止當前協程運行,調度器確保所有已注冊defer延遲調用執行
有時候我們會遇到這個問題
調度器確保所有已注冊defer延遲調用被執行,要在Goexit之前注冊
func test() {defer fmt.Println("test-------")return //終止使用此函數fmt.Println("1111111111") }func main() {go func() {fmt.Println("aaaa")//調用了別的函數test()//沒打印fmt.Println("bbb")}() //別忘記()for {}}輸出
aaaa test------- bbb func test() {defer fmt.Println("test-------")//終止這個協程runtime.Goexit()//returnfmt.Println("1111111111") }func main() {go func() {fmt.Println("aaaa")//調用了別的函數test()//沒打印fmt.Println("bbb")}() //別忘記()for {}}輸出
aaaa test-------GOMAXPROCS
調用runtime.GOMAXPROCS()用來設置可以并行計算的cpu核數的最大值,并返回之前的值
func main() {//指定核數n := runtime.GOMAXPROCS(2)fmt.Println(n) }多任務資源競爭
//定義一個打印機 //打印機屬于公共資源 func Printer(str string) {for _, data := range str{fmt.Printf("%c", data)time.Sleep(time.Second)}fmt.Printf("\n") }func Person1() {Printer("hello") }func Person2() {Printer("world") }func main() {//新建2個協程,代表2個人,2個人同時使用打印機go Person1()go Person2()//特意不讓主協程結束,死循環for {}}打印會亂掉
我們如何讓他同步呢
其他的小功能
返回go的根目錄,存在GOROOT環境變量返回該環境變量,不存在返回go的根目錄
func GOROOT() string版本
func Version() stringcpu個數
func NumCPU() intGC
func GC()查看時間
go build main.go time -p ./main輸出結果:
0 9223372030412324865 1 9223372030412324865 real 1.92 // 程序開始到結束時間差 ( CPU 時間) user 3.80 // 用戶態所使用 CPU 時間片 (多核累加) sys 0.01 // 內核態所使用 CPU 時間片命令行輸入:
GOMAXPROCS=8 time -p ./main輸出結果:
1 9223372030412324865 0 9223372030412324865 real 1.89 user 3.76 // 雖然總時間差不多,但由 2 個核并行,real 時間自然少了許多。 sys 0.00 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的golang中的runtime的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang协程退出
- 下一篇: golang中的select详解