相同点:
协程跟线程很接近,但是又有区别,我们先来看看协程跟线程一样的地方:函数运行时都会开辟自己的独立栈,局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西,这一点是不是跟线程很像?
不同点:
协程和线程最主要的区别在于:多个线程可以一起跑,他们可以共同去竞争cpu,也就是说多个线程是可以同时并行运行的。而协程就不一样了,多协程的话,只有一个协程在跑,其他协程就必须在那里等着,只有正在跑的协程主动挂起或者运行结束的时候,才轮到其他协程工作。
我在其他技术文章里面有看到,有作者提到“**多协程程序在同一时间只能运行一个协程**”把这个作为协程和线程的区别了。其实我不太赞成这样的观点,可能作者本意不是这样的。但是容易引起歧义。怎么说呢,在同一时间其实真正在跑的线程也就仅仅只有一个,不可能有两个线程同时跑的。所以同一时间能够运行的协程和线程都是一样的,都只有一个在跑。那他们的真正区别是什么呢?这里可能需要引入cpu轮转抢占去说明可能更合适一些。稍微懂点操作系统的童鞋应该都知道。cpu会有一个时间片,每一个时间内都只会有一个线程在运行,其他线程都会放在等待队列里面,等待翻牌子。当这个时间片时间一结束,正在运行的线程就会从cpu这个皇帝的床上退出来,退回到其他线程的等待队列中,重新竞选翻牌子,皇帝翻到谁的牌子,哪个线程就能够跟cpu宠幸,然后等到时间片时间到了,新的一轮翻牌子又要开始了。。。
协程这个妃子就不一样了,她可是有脾气的。皇帝你翻我牌子了,就要跟妃子我好好过,我没休息没来大姨妈之前,都不许皇帝碰其他妃子,就算时间片时间到了,也不允许换妃子。。。嗯,就是这么有个性~~~~
举了个皇帝翻牌子的例子,不知道大家有没有看懂呢?
性能对比:
协程是在纯用户态下执行的,它的创建和切换的开销,要远远小于线程。所以单从性能上来讲协程是要优于线程的。
结束语:
第一次写博客,写的不对的地方,希望大家能够指正,下一期我们就来讲下协程的具体用法,敬请期待~~~~
03-05 15:55