routine 协程
轻量级“线程”
非抢占式多任务处理,由协程主动交出控制权
编译器 / 解释器 / 虚拟机层面的多任务
多个协程可能在一个或多个线程上运行(线程数量一般不大于机器核数)
goroutine 并发栗子
func main() { for i := 0; i < 1000; i++ { go func(j int) { //for { fmt.Println("i am routine",j)
// runtime.Gosched() // 手动交出控制权 //} }(i) } time.Sleep(time.Millisecond) }
goroutine 可能会切换的点
解释: 任何函数加上go就能送到调度器运行 调度器会在合适的位置进行协程的切换
I/O,select
channel
等待锁
函数调用(有时)
runtime.Gosched()
检测数据访问冲突(检测race condition)
func main() { a := 1 for i := 0; i < 1000; i++ { go func(j int) { //race condition for { a++ } }(i) } time.Sleep(time.Millisecond) }
检测命令
go run -race test.go