协程是什么
协程当然不是卖票的软件,他可以说是程序员意淫出来的。
操作系统并不承认协程的存在
可以说协程是开发人员自己设计的能够骗过操作系统的一种方式。
操作系统—》多个进程
进程—》多个线程
线程—》多个协程
操作系统可以开多个进程,进程可以开多个线程,线程又可以开多个协程。
一切都是为了并发,而开多个协程是为了能够提高效率,为什么,看下面。
现在有一条线程,他有3个方法需要执行,第一个方法要睡三秒,第二个方法要睡四秒,第三个方法是最重要的代码在里面。
正常情况下,通过操作系统对cup的调度,要想执行完这个线程的所有任务,至少要7秒多对吧?
cup切到这个线程上,发现在io,切走了,确实io不用占用cpu也可以继续执行,但是要想在执行第二个方法,必须等上三秒,这个等待的时间,cup切到过这个线程很多很多很多次,但都发现这个线程在io,等到他结束了io,cup切了回来,看到第二个任务又是睡四秒,又是io,于是同样的事情发生了,继续等四秒。也就是说想要执行完这个线程的全部内容至少要7秒多。
现在我们聪明的程序员使用了协程,就是在这个线程里面,遇到io,自己切,并且不然操作系统发现,在这几个任务里面来回狂切,然后这些io就开始一起io了,然后最多是不是就io4秒?省下了很多时间。
要注意的是,在这io的四秒钟,cpu也会切到别的线程去,因为就算操作系统没发现你在io,你也占用了很久的cpu了,这就是两种会让cpu切换的情况之一,使用时间过长,如果不用协程,就会是io让cpu切走了。
现在被切走了又有什么关系呢?我们两个方法的io已经开始了。而且自己控制切换要比操作系统切换快的多.降低了单个线程的io时间。
最重要的一点是什么?
协程只适合io密集型任务
你们应该都发现了,他的作用就是让io一起来,不是串行。所以他在搞计算密集型的时候,就没有意义了,反而会更加耗时,因为他会不停的来回切来回切。
总结一下
python的线程用的是操作系统原生的线程
协程:单线程下实现并发
并发:切换+保存状态
多线程:操作系统帮你实现的,如果遇到io切换,执行时间过长也会切换,实现一个雨露均沾的效果.
什么样的协程是有意义的?
遇到io切换的时候才有意义
具体:
协程概念本质是程序员抽象出来的,操作系统根本不知道协程存在,也就说来了一个线程我自己遇到io 我自己线程内部直接切到自己的别的任务上了,操作系统跟本发现不了,
也就是实现了单线程下效率最高.
优点:
自己控制切换要比操作系统切换快的多
缺点:
对比多线程
自己要检测所有的io,但凡有一个阻塞整体都跟着阻塞.
对比多进程
无法利用多核优势.
为什么要有协程(遇到io切换)?
自己控制切换要比操作系统切换快的多.降低了单个线程的io时间,