协程:实现协作式多任务,可以在程序执行内部中断,转而执行其他协程。
比如我们编写子程序(或者说函数),通常是利用“调用”来实现从 A 跳去 B,B 跳去 C,如果想回来调用方,必须等被调用方执行完才行,整个调用过程是通过栈实现的。而协程是运行子程序的过程中“中断”,转而执行其他子程序,再在适当的时候返回来接着运行。
二、协程与线程的区别
协程相比于线程的优势: 1、协程效率比线程高。线程间切换需要开销,而协程间切换是由程序自身控制的,不需要开销。 2、协程不需要多线程的锁机制。协程是在一个线程内进行切换,所以不存在同时写变量冲突,不需要给共享资源加锁,只需要判断状态。
PS:如果想使用多CPU的话,可以使用进程+协程。
三、协程的实现
协程是通过yield实现的,所以协程是生成器,可以通过 next 调用。
1、什么是进程、线程、协程?
答案要点: a、进程是资源分配,每个进程拥有独立的资源空间,因为进程不共享资源,所以就涉及到进程间通信的方式,常见的方式有:消息队列、管道、信号量、socket套接字等。(这里会引申出几个面试题:进程间有通信方式有哪些?-> 使用过哪些消息队列?)
b、线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程是在进程下,所以同一进程下的多个线程是能共享资源的。线程能共享的资源有:堆、全局变量、文件描述符和信号处理等,不共享的资源:栈、寄存器等(这里会引申出的面试题:多线程怎么实现?-> 多线程并发问题 -> 多线程共享哪些资源)
c、协程是单线程下实现多任务,它通过 yield 关键字来实现,能有效地减少多线程之间切换的开销。它是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
2、协程有什么优缺点? 答案要点 a、协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),性能得到了很大的提升,不会像线程切换那样消耗资源。
b、缺点:异步代码,可能不那么容易理解和调度
作者:超大大小猿
链接:https://www.jianshu.com/p/a8aa3a332bb9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。