## 一、概念
* runtime.Gosched():出讓CPU時間片,等待重新安排任務
* runtime.Goexit():立刻結束當前協程的執行
* runtime.GOMAXPROCS():設置并行計算的CPU最大核數
## 二、runtime.Gosched()實例
#### 沒有runtime.Gosched()
~~~
package main
import (
"fmt"
)
func main() {
// 子協程
go func(s string) {
for i:=0;i<3;i++ {
fmt.Println(s)
}
}("hello")
// 主協程
for i:=1;i<3;i++ {
fmt.Println("aaa")
}
}
~~~
執行結果:
hello
hello
hello
aaa
aaa
#### 有runtime.Gosched()
注:通過上面多次執行我們發現,很多情況下都先打印出主協程中的內容,如果我們想更多的機會先打印子協程中的內容那么我們可以在主協程中加runtime.Gosched()
~~~
package main
import (
"fmt"
"runtime"
)
func main() {
// 子協程
go func(s string) {
for i:=0;i<3;i++ {
fmt.Println(s)
}
}("hello")
// 主協程
for i:=1;i<3;i++ {
runtime.Gosched()
fmt.Println("aaa")
}
}
~~~
打印結果:
hello
hello
hello
aaa
aaa
## 三、runtime.Goexit()
#### 沒有runtime.Goexit()
~~~
package main
import (
"fmt"
)
func main() {
// 子協程
go func() {
defer fmt.Println("A.defer")
func(){
defer fmt.Println("B.defer")
fmt.Println("B")
}()
defer fmt.Println("A")
}()
// 主協程
for i:=1;i<3;i++ {
fmt.Println("aaa")
}
}
~~~
打印結果:
B
B.defer
A
A.defer
aaa
aaa
#### 有runtime.Goexit()
~~~
package main
import (
"fmt"
"runtime"
)
func main() {
// 子協程
go func() {
defer fmt.Println("A.defer")
func(){
defer fmt.Println("B.defer")
runtime.Goexit()
fmt.Println("B")
}()
defer fmt.Println("A")
}()
// 主協程
for i:=1;i<3;i++ {
fmt.Println("aaa")
}
}
~~~
打印結果:
aaa
aaa
注: runtime.Goexit()不影響defer的執行
## 三、runtime.GOMAXPROCS()
~~~
package main
import (
"fmt"
"runtime"
)
func main() {
// 使用4個核去執行程序
n := runtime.GOMAXPROCS(4)
fmt.Printf("n=%d\n",n)
// 假設我們讓一個核去執行一個程序
for{
go fmt.Print(0)
fmt.Print(1)
}
}
~~~
- 一、數組
- 二、切片
- 三、copy
- 四、MAP
- 五、結構體
- 六、結構體參數
- 七、面向”對象“
- 1、匿名字段
- 2、方法
- 3、包和封裝
- 4、接口
- 5、異常處理
- 八、Json
- 九、文件操作
- 1、寫文件
- 2、讀取文件內容
- 3、拷貝文件
- 十、反射
- 1、查看類型,字段和方法
- 2、查看匿名字段
- 3、修改基本類型的值
- 4、修改結構體的值
- 5、調用方法
- 十一、并發編程
- 1、并行和并發
- 2、協程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定時器
- 8、select
- 9、協程同步鎖
- 十二、socket編程
- 十三、Http編程
- 十四、并發爬蟲和數據處理
- 1、簡易爬蟲實例
- 2、并發爬取圖片
- 3、讀文件中的數據
- 4、數據清洗
- 其他
- 1、推薦文章