昨天我偶然听到协程这个概念,不禁好奇地了解了一下,做些笔记如下:
一、什么是协程
协程是在线程内部,由程序自己控制逻辑, 显式地让出控制权(yield)来实现任务切换,而不是由操作系统按照时间片轮转的方式强制执行暂停。具体来说,线程内部有所谓执行单元,程序将控制权暂停此而交给彼,以协作的方式执行任务,故名协程。
二、协程与多线程的区别
协程是线程内部的协作模式,与多线程不是同一个概念。协程由程序自己控制,而多线程由操作系统控制。由于没有线程切换的昂贵开销和复杂的线程调度,协程要比多线程轻量。
三、什么情况下使用协程
协程适合用在IO密集型操作,而多线程适合用在CPU密集型操作。IO,如网络,文件,硬盘操作,常常比较耗时,采用协程,在线程内部控制,经济又高效。但协程不适合用在CPU密集型操作的场景。因为CPU很快,根本不需要等待,协程没有机会使用;二来程序逻辑需要消耗CPU时间片,强行控制,反而会消耗更多的CPU资源。
多线程就不同了,一般来说,一块CPU或者一个CPU内核就对应一条线程(?),多CPU的情况下,多线程可以发挥硬件的优势。
四、如何使用协程
以javascript为例,asyn和await就类似协程的方式。javascript是单线程,虽然没有直接称为“协程”的概念,但通过async和await关键字实现的异步函数提供了类似的功能。JavaScript中的异步编程模型基于事件循环和Promise机制,允许以同步的方式编写异步代码,这与协程的概念非常相似。
五、协程与多线程的结合
协程和多线程确实可以一起使用,这种组合能够结合两者的优点,提供更灵活的并发处理方案。