func main() { for i := 0; i < 1000; i++ { go func(i int) { for { fmt.Printf("Hello from"+"goroutine %d\n", i) } }(i) } time.Sleep(time.Millisecond) }
1 轻量级"线程",
2 非抢占式多任务处理,由协程主动交出控制权
3 编译器/解释器/虚拟机层面的多任务
4 多个协程可能在一个或多个线程上运行
任何函数只需要加上go就能送给调度器运行
不需要再定义时区分是否是异步函数
调度器在合适的点进行切换,开发人员仅能控制部分
使用-race来检测数据冲突
1 I/O,select
2 Channel
3 等待锁
4 函数调用(有时)
5 runtime.Gosched()
6 只是参考,不能保证切换,不能保证在其他地方不切换