一、协程Coroutine
1.轻量级“线程”;
2.非抢占式多任务处理,由协程主动交出控制权;
3.编译器/解释器/虚拟机层面的多任务;
4.多个协程可能在一个或多个线程上运行;
二、其他语言中的协程
C++:Boost.Coroutine
Java:不支持
python:使用yield关键字实现协程
python3.5:使用async def 对协程进行了原生支持
三、goroutine的定义
1.任何函数只需加上go就能送给调度器运行
2.不需要再定义时区分是否是异步函数
3.调度器在合适的点进行切换
4.使用-race来检测数据访问冲突
示例:
func main() {
var a [10]int
for i := 0; i < 10; i++ {
go func(i int) {
for {
a[i]++
runtime.Gosched()
}
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println(a)
}
四、goroutine可能的切换点
1.I/O,select
2.channel
3.等待锁
4.函数调用(有时)
5.runtime.Gosched()
只是参考,不能保证切换,不能保证在其他地方不切换