1.select操作阻塞的时候
select
是一个用于处理多个通道(channels)操作的关键字,它用于选择多个通道中的一个进行操作。当多个通道都准备好时,select
会随机选择一个执行。如果没有任何通道准备好,select
会根据某些条件进行阻塞。
2.io,通道(channel)的发送和接收被阻塞
当该gorutine在进行I/O操作时(网络请求,文件读取等),就会阻塞当前协程,GO会调用其他协程,并且将该协程标记为阻塞状态.
4.程序员显示编码操作
3.时间片轮转
5.等待锁
在 Go 中,sync.Mutex
是用来实现互斥锁的标准库类型,它提供了 Lock
和 Unlock
方法。当一个 goroutine 调用 Lock
方法时,如果锁已经被其他 goroutine 持有,当前 goroutine 将会阻塞,也就会被切换到其他的协程执行,直到锁被释放
6.程序调用(系统自行调用或者显示调用)
import "runtime"
go func() {
// 做一些计算或任务
runtime.Gosched() // 主动让出 CPU 执行权
// 继续执行其他任务
}()