Go的第14课——runtime包

go并发编程之runtime包

runtime包里面定义了一些协程管理相关的api

runtime.Gosched()

让出CPU时间片,重新等待安排任务。

比如说下面这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
"time"
)

func show(s string) {
for i := 0; i < 2; i++ {
fmt.Println(s)
}
}
func main() {
go show("java")
//主协程
for i := 0; i < 2; i++ {
runtime.Gosched() //注释掉查看结果
fmt.Println("golang")
}
time.Sleep(1)
}
/*
java
java
golang
golang
*/

考虑这两种情况:

  1. 注释掉runtime.Gosched()语句
  2. 多注释掉 sleep 语句

发现注释掉 runtime.Gosched() 语句之后输出结果为

1
2
3
4
5
6
/*
golang
golang
java
java
*/

注释掉 sleep 语句且注释掉 runtime.Gosched() 语句我们几乎只能看到两个 golang 了,因为主协程退出其它协程也不运行了。

1
2
3
4
/*
golang
golang
*/

runtime.Goexit()

退出当前协程,如果当前协程为主协程则造成一个 fatal error。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
"fmt"
"runtime"
"time"
)

func show(s string) {
for i := 0; i < 2; i++ {
fmt.Println(s)
runtime.Goexit()
}

}
func main() {
go show("java")
//主协程
for i := 0; i < 2; i++ {
runtime.Gosched() //注释掉查看结果
fmt.Println("golang")
}
show("C++")
time.Sleep(1)
}
/*
java
golang
golang
C++
fatal error: no goroutines (main called runtime.Goexit) - deadlock!
*/

runtime.GOMAXPROCS(num int)

CPU 最大核心数设置

使用 runtime.NumCPU() 可以查看这个值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

import (
"fmt"
"runtime"
)

func show(s string) {
for i := 0; i < 3; i++ {
fmt.Println(s)
// time.Sleep(1)
}

}
func main() {
fmt.Printf("CPU num:%d\n", runtime.NumCPU())
runtime.GOMAXPROCS(1)
fmt.Printf("CPU num:%d\n", runtime.NumCPU())
go show("java")
go show("C++")
go show("python")
show("C#")
}
package main

import (
"fmt"
"runtime"
)

func show(s string) {
for i := 0; i < 3; i++ {
fmt.Println(s)
// time.Sleep(1)
}

}
func main() {
fmt.Printf("CPU num:%d\n", runtime.NumCPU())
runtime.GOMAXPROCS(1)
fmt.Printf("CPU num:%d\n", runtime.NumCPU())
go show("java")
go show("C++")
go show("python")
show("C#")
}

再设置 CPU 核心数的时候,如果设置为1则在这个程序中则看不到交替运行输出的场景,设置为其它值则可以,不过我记得 CPU 单核好像也能上下文切换来着的,可能它这里不作切换?