### Gosched()
使當前Go協程放棄處理器,讓其他協程運行。不會掛起當前協程,未來恢復執行。
Go語言的協程是搶占式調度,當遇到長時間執行或者系統調用時,會主動把當前goroutine的CPU(P)轉讓出去,讓其他的goroutine能夠被調用并執行,一般出現以下幾種情況,goroutine就會發生調度:
* [ ] ayscall
* [ ] C函數調用
* [ ] 主動調用runtime.Goschen
* [ ] 某個goroutine的調用超過100ms,并且調用了非內聯的函數
> **runtime.Gosched()**
>
由于main函數搶占了CPU的控制權,導致第一個for循環沒有運行完。如果想要第一個for循環執行,在第二個for循環中使用runtime.Gosched()來阻止獲得控制權
```
package main
import (
"fmt"
// "runtime"
)
func main() {
go func() {
for i := 0; i < 3; i++ {
fmt.Println("go")
}
}()
for i := 0; i < 2; i++ {
// runtime.Gosched()
fmt.Println("main")
}
}
結果:
main
main
go
```
### Goexit()
終止調用的協程,其他的不受影響
> **runtime.Goexit()**
```
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func() {
defer fmt.Println("defer關鍵詞 會讓表達式最后執行")
fmt.Println("Hello World")
}()
go func() {
defer fmt.Println("defer關鍵詞 會讓表達式最后執行")
fmt.Println("你好,世界!")
runtime.Goexit() // 效果和return一樣
fmt.Println("這里不會執行")
}()
time.Sleep(time.Second * 5)
}
結果:
你好,世界!
Hello World
defer關鍵詞 會讓表達式最后執行
defer關鍵詞 會讓表達式最后執行
```
### GOMAXPROCS()
設置程序運行中使用的CPU數,可設置同時執行最大CPU數。
> runtime.GOMAXPROCS()
```
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
n := runtime.GOMAXPROCS(1)
fmt.Println("先前最大核心數為", n)
// 運行時間戳 毫秒
last := time.Now()
// 耗時任務
for i := 0; i < 10000000; i++ {
a := 1
a += 1
}
now := time.Now()
// 計算程序運行的時間
fmt.Println(now.Sub(last))
}
結果:
先前最大核心數為 12
2.1563ms
```
- 安裝開發環境
- 安裝開發環境
- 安裝詳細教程
- 引入包
- Go語言基礎
- 基本變量與數據類型
- 變量
- 數據類型
- 指針
- 字符串
- 代碼總結
- 常量與運算符
- 常量
- 運算符
- 流程控制
- if判斷
- for循環
- switch分支
- goto跳轉
- 斐波那契數列
- Go語言內置容器
- 數組
- 切片
- 映射
- 函數
- 函數(上)
- 函數(中)
- 函數(下)
- 小節
- 包管理
- 結構體
- 結構體(上)
- 結構體(中)
- 結構體(下)
- 小節
- 錯誤處理
- 錯誤處理
- 宕機
- 錯誤應用
- 小節
- 文件操作
- 獲取目錄
- 創建和刪除目錄
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 處理JSON文件
- 接口與類型
- 接口的創建與實現
- 接口賦值
- 接口嵌入
- 空接口
- 類型斷言(1)
- 類型斷言(2)
- 小節
- 并發與通道
- goroutine協程
- runtime包
- 通道channel
- 單向通道channel
- select
- 線程同步
- 多線程的深入學習
- http編程
- http簡介
- Client和Request
- get請求
- post請求
- 模塊函數方法
- 模塊
- fmt庫,模塊
- 項目練習
- 爬蟲:高三網
- 爬蟲:快代理
- 爬蟲:快代理2
- 多線程:通道思路
- 多線程爬蟲:快代理