协程特点

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 

  

posted @ 2019-12-08 22:38  lizcao  阅读(420)  评论(0编辑  收藏  举报