协程特点
1、下面协程执行后看不到执行的结果
func main(){ for i :=0;i<10;i++{ go func(i int){ // 协程 Coroutine 轻量级线程 for{ fmt.Println(i) } }(i) } }
main也可以看做是一个协程,main里面又开了很多的协程,里面的协程还没有来得及执行,main函数就结束了,main作为一个特殊的函数一旦结束其它协程都会被杀死,所以没有任何的输出。如果将上面的10加大改成10000呢,再执行程序一般是可以看到一些结果输出的,因为10000足够大,在创建协程的时候,有一些协程就执行了。
2、非抢占式多任务处理,由协程主动交出控制权。如何理解呢,看上面的代码println是IO操作,只有在IO操作的时候才会进行协程的切换,因为IO需要等待的。当协程里不是IO操作的时候,会有啥结果呢
func main(){
var a [10]int
for i :=0;i<10;i++{
go func(i int){
// 协程 Coroutine 轻量级线程
for{
//fmt.Println(i)
a[i]++
}
}(i)
}
time.Sleep(time.Millisecond)
}
这里移除了IO操作,改成了数组操作。结果是程序会一直卡在第一个协程里,无法交出控制权。
切换的点
I/O
channel
等待锁
函数调用(有时)
runtime、Gosched