非抢占式多任务

任何函数前加上 go 即可送给调度器运行go func()

main 函数也是一个goroutine

调度器在合适的时候进行切换

可能的切换点:

I/O,select

channel

等待锁

函数调用

runtime.Gosched()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for i := 1; i < 10; i++ {
go func(i int) {
for {
fmt.Println("hello from:", i)
}
}(i)
}
time.Sleep(time.Second)

//a[i]++ 语句是不需要协程切换的,如果不手动释放会一直占用
var a [10]int
for i := 1; i < 10; i++ {
go func(i int) {
for {
a[i]++
runtime.Gosched()//释放自己 交出控制权
}
}(i)
}
time.Sleep(time.Second)
fmt.Println(a)