91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中runtime的使用詳解

發布時間:2020-09-03 23:34:17 來源:腳本之家 閱讀:516 作者:田飛雨 欄目:編程語言

runtime 調度器是個非常有用的東西,關于 runtime 包幾個方法:

  • Gosched:讓當前線程讓出 cpu 以讓其它線程運行,它不會掛起當前線程,因此當前線程未來會繼續執行
  • NumCPU:返回當前系統的 CPU 核數量
  • GOMAXPROCS:設置最大的可同時使用的 CPU 核數
  • Goexit:退出當前 goroutine(但是defer語句會照常執行)
  • NumGoroutine:返回正在執行和排隊的任務總數
  • GOOS:目標操作系統

NumCPU

package main

import (
  "fmt"
  "runtime"
)

func main() {
  fmt.Println("cpus:", runtime.NumCPU())
  fmt.Println("goroot:", runtime.GOROOT())
  fmt.Println("archive:", runtime.GOOS)
}

運行結果:

Golang中runtime的使用詳解

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

}

結果:

Golang中runtime的使用詳解

使用多核測試:

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

}

結果:

Golang中runtime的使用詳解

根據你機器來設定運行時的核數,但是運行結果不一定與上面相同,或者在 main 函數的最后加上 select{} 讓程序阻塞,則結果如下:

Golang中runtime的使用詳解

多核比較適合那種 CPU 密集型程序,如果是 IO 密集型使用多核會增加 CPU 切換的成本。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乡市| 什邡市| 元朗区| 常宁市| 沁水县| 五常市| 客服| 新兴县| 卢氏县| 前郭尔| 贡觉县| 上饶市| 平罗县| 林口县| 临潭县| 缙云县| 桂东县| 邻水| 松桃| 扎鲁特旗| 广水市| 伊宁市| 敦煌市| 大港区| 霍林郭勒市| 鹤壁市| 太和县| 抚顺县| 花莲市| 五家渠市| 宝鸡市| 璧山县| 佛冈县| 明水县| 铜陵市| 宁蒗| 仁化县| 绥芬河市| 玛纳斯县| 邵阳县| 贵南县|