Golang管理协程时也必然会涉及到协程之间的切换:阻塞的协程被切换出去,可运行的协程被切换进来。
出现阻塞,意味 CPU 在当前执行域没活干了,它在干等,换 go 而言,调度器要 goroutine 上下文切换。
至于切换到哪个 goroutine,由调度器决定。但可以肯定的是对同一 chan 所相关的 goroutine 执行有序
1 、select操作阻塞时
2、io阻塞
3、阻塞在channel:
chan 读写出现阻塞时,runtime 会隐式地进行上下文切换
4、程序员显式编码操作,如下:
显式交给调度器切换,否则有的goroutine就饿死了
runtime.Gosched()
5、等待锁
6、程序调用
time.Sleep(3*time.Second) Go协程特点: Go 原生支持协程,通过 go func () 就可以创建一个 goroutine Goroutine 之间的通信更简单,通过 channel call 即可实现,上下文切换透明 Goroutine 可以被多个线程调度,可以利用多核