协程的好处有哪些?

我觉得线程是很丑陋的东西。线程不过是反映了当前硬件技术的物理限制瓶颈。单个cpu的计算能力不足,所以要多核。内存的容量太小太昂贵,所以需要硬盘。无须敬畏,当你认识到线程不过是个妥协的产物,学习的难度就低多了。比如计算能力低引入了多核,多核引入了并发,并发引入了竞态,竞态引入了锁,一层又一层的引入了复杂性,我等程序员的饭碗才能保住。当然有些问题确实不是单纯的计算能力或存储能力极大提升就能解决的,不是我的工作范围,就不献丑了。

协程比线程更基础。协程不能像线程那样,简单看做一种硬件妥协机制。协程是可以作为语言的内建机制的,因为协程反映了程序逻辑的一种需求:可重入能力。这个能力很重要,因为大多数语言的一个最重要的组件--函数,其实就依赖这个能力的弱化版本。函数中的局部变量,被你初始化为特定的值,每次你调函数,换种说法:重入函数,语言都保证这些局部变量的值不会改变。相同的输入,得到相同的输出。当然你跟我扯全局变量就没意思了。

语言实现到函数这一步,可以满足绝大多数日常需求了。但工程师就是又懒又爱折腾啊。函数在很多语言特别是早期语言中,有个别名:过程(具体特性不一定相同,就不追究了,整体的行为还是差不离的)。我觉得过程这个词比函数更贴切。现在我们把“函数中局部变量的值”换种说法,叫做“过程中的局部状态”,这个说法更广泛了。每次重入过程,过程中的局部状态都被重置。要想得到不同的输出状态,唯有改变输入的状态。要想明确一个输出状态,对应的输入状态,唯有记录下输入状态。so simple,so native。问题是那帮懒惰的工程师甚至连输入状态都不想保存判断啊。他们希望有这么一种过程,每次进入,过程里的局部状态,都能保留上一次进入的状态。自然也就不需要干针对输入状态的保存或判断工作了。换言之,这个特殊过程把原来需要在过程之外的用来控制过程输出状态的那些输入状态的管理工作,都交给过程本身了。

这个特殊的过程,就叫做协程。它能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。普通过程(函数)可看成这个特殊过程的一个特例:只有一个状态,每次进入时局部状态重置。这种逻辑控制上的方便当然让这帮懒惰的工程师乐翻了天,少打了好多字,可以向老板叫嚣生产力提高了,其实又可以多lol几把了,对不对?用协程的好处是,你处在更高的逻辑层面去审视需求,整理代码。没有函数之前,你只有表达式,没有表达式之前,你只有mov。没有if-else之前,你只有jump。脱离低级的逻辑处理,就意味着能在更高的抽象层面看问题。就好像如果你在算傅里叶变换时,还要每次去思考四则混合运算规则,只能是自作死。协程之所以陌生,是因为这个能力很强大,因此通常跟实际业务联系很紧密吧。

因此,协程不过是一个逻辑控制需求(异步编程,不同于同步编程)。一些语言原生支持,不支持也可以用原有的材料构建出来。协程的实现,无非是你要维护一组局部状态,在重新进入协程前,保证这些状态不被改变,你能顺利定位到之前的位置。你平时所写的一些逻辑控制代码,经典如状态机或对象等,也许就已经是一种“协程”了。区别在于是否精巧,适用条件是否苛刻,使用是否方便,效率是否足够罢了。

面向对象中的对象,函数式语言中过程的chunk实现,都跟协程有些相似的结构。这些语言的表达足够丰富,有没有协程,倒不构成问题。真要说起来,我觉得协程的最大的好处是在写过程式(命令式)风格的代码时,很好的简化了逻辑的流程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值