在runtime包中,有一個方法是GOMAXPROCS。在我看來,這個函數名有點誤導人:人們經常認為這個函數與主機上邏輯處理器的數量有關, 但是這個函數真正控制著將要托管所謂的“工作隊列”的操作系統線程的數量。在第6章我們會討論關于它的更多詳細信息。
在Go 1.5之前,GOMAXPROCS總是設置為1,通常你會在大多數Go程序中找到這個片段:
```
runtime.GOMAXPROCS(runtime.NumCPU())
```
幾乎所有的開發人員都希望利用其進程能夠使用計算機上的所有內核。因此,在隨后的Go版本中,它被自動設置為主機上的邏輯CPU數量。
那么,如果你想調整這個值呢? 大多數時候你盡量別這么想。Go的調度算法在大多數情況下足夠好,即增加或減少工作隊列和線程的數量可能會造成更多的傷害,但仍然有些情況下可能會更改此值。
例如,我曾經參與過一個項目,該項目有一個受競爭條件困擾的測試套件。事實上,該團隊有一些測試包有時會失敗。我們運行測試的基礎架構只有四個邏輯CPU,因此在任何一個時間點,我們都有四個goroutines同時執行。 通過增加GOMAXPROCS超過我們所擁有的邏輯CPU數量,我們能夠更頻繁地觸發競態條件,從而更快地糾正它們。
有人可能會通過實驗發現,他們的程序在一定數量的工作隊列和線程下運行得更好,但我敦促謹慎行事。如果你通過調整CPU來壓縮性能,請務必在每次提交后,使用不同硬件以及使用不同版本的Go時執行此操作。調整這個值是以更高的抽象和長期性能穩定性的降低為代價的。
* * * * *
學識淺薄,錯誤在所難免。我是長風,歡迎來Golang中國的群(211938256)就本書提出修改意見。
- 前序
- 誰適合讀這本書
- 章節導讀
- 在線資源
- 第一章 并發編程介紹
- 摩爾定律,可伸縮網絡和我們所處的困境
- 為什么并發編程如此困難
- 數據競爭
- 原子性
- 內存訪問同步
- 死鎖,活鎖和鎖的饑餓問題
- 死鎖
- 活鎖
- 饑餓
- 并發安全性
- 優雅的面對復雜性
- 第二章 代碼建模:序列化交互處理
- 并發與并行
- 什么是CSP
- CSP在Go中的衍生物
- Go的并發哲學
- 第三章 Go的并發構建模塊
- Goroutines
- sync包
- WaitGroup
- Mutex和RWMutex
- Cond
- Once
- Pool
- Channels
- select語句
- GOMAXPROCS
- 結論
- 第四章 Go的并發編程范式
- 訪問范圍約束
- fo-select循環
- 防止Goroutine泄漏
- or-channel
- 錯誤處理
- 管道
- 構建管道的最佳實踐
- 便利的生成器
- 扇入扇出
- or-done-channel
- tee-channel
- bridge-channel
- 隊列
- context包
- 小結
- 第五章 可伸縮并發設計
- 錯誤傳遞
- 超時和取消
- 心跳
- 請求并發復制處理
- 速率限制
- Goroutines異常行為修復
- 本章小結
- 第六章 Goroutines和Go運行時
- 任務調度