对于IO密集型的程序,一般比较高效的做法是选择异步来实现,因为使用异步的方法更容易写出高效的程序。然而使用异步的话,经验较少的人往往会使自己的程序结构变得很混乱,进而导致程序的可读性变差。记得有人说过,在硬件飞速发展的现在,程序的可读性和可维护性的重要性在不断提高,甚至有一种更激进的说法,程序的可读性是第一位的。从Boost的1.54版本开始,coroutine引入了一种新型的协程,stackfull协程,之前Boost库的协程是stackless协程。对于这两者的区别,我仅知道stackless协程不可以使用局部变量,只能通过全局变量和类内部的变量实现信息传递,而stackfull协程则可以使用全局变量。可能是二者的实现方法不同吧,对于二者的效率差别,几乎可以忽略。哦,忘了介绍什么是协程了。。。

  与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自SimulaModula-2语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务迭代器无限列表管道

  由于协程不如子例程那样被普遍所知,最好对它们作个比较。子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次。协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回);相反,协程的生命期完全由他们的使用的需要决定。

  这里有一个很重要的特点,协程可以多次进入和退出,并且下一次进入的地方正好是上一次退出的地方。举个例子,

void fun()
{
do1(); //1 do2(); //2 do3(); //3
}

对于这样的一个函数过程,如果使用协程的方法实现的话,那么这个调用过程可以在do1的地方退出,然后在下一次进入,并且进入后直接从do2处开始执行。

  那么一个协程适合做什么呢?你想,对于IO密集型程序中,IO系统调用往往不会很及时的返回,如果你选择使用同步的方法,你的程序往往可能会是下面的样子:

void fun()
{
read(buf, ...);
write(buf, ...);
}

而如果你使用的是异步的话,你的程序可能会是下面的样子:

void fun()
{
async_read(buf, read_handler);
} void read_handler()
{
do_somethiing//...
async_write(buf, write_handler);
} void write_handler()
{
do_something//..
}

这样的调用层次少的话,还可以接受,一旦多了,整个程序读起来会让人十分的崩溃。协程的出现解决了这个问题。

而如果你选择异步+协程的方法,你的程序不用等,并且会变得跟同步程序一样可读性很好。下面用我的一个简单的例子来说明stackfull协程的使用方法。程序主要实现了从控制台实现异步读和异步写的功能。代码十分简单,就不用说明了。(oh, 博客园的代码缩进简直就是shit, 算了直接贴代码地址吧)。

我一共用了两种方法实现该功能作为对比,一种是仅使用异步的方法,一种是适用异步+协程的方法。从整个代码的组织结构你可以看出使用了协程之后,整个程序的可读性大幅度提高,对于性能呢,你完全不用担心,几乎差别可以忽略。(注:这两份代码都是linux平台实现的,控制台异步输入输出的方法对于windows不适用。)

异步的代码地址:https://github.com/xiaopeifeng/CodeTricks/blob/master/async_say_love_fxp.cc

协程的代码地址:https://github.com/xiaopeifeng/CodeTricks/blob/master/spawn_say_love_fxp.cc

协程的具体实现方法,以后再做研究。

spawn协程学习的更多相关文章

  1. python 线程 进程 协程 学习

    转载自大神博客:http://www.cnblogs.com/aylin/p/5601969.html 仅供学习使用···· python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和 ...

  2. python简单线程和协程学习

    python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的p ...

  3. python 协程学习

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  4. 流畅的python第十六章协程学习记录

    从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数.可是,在协程中,yield 通常出现在表达式的右边(例如,datum = yield),可以产出值,也可以不产出——如果 yi ...

  5. golang 协程学习

    协程数据传递问题 func TestGoroutineData(t *testing.T) { var wg sync.WaitGroup wg.Add(1) i := 0 go func(j int ...

  6. Lua协程学习

    按照书上码了下,但运行有问题,暂时不知道原因: function send (x) coroutine.yield(x) end function producer() return coroutin ...

  7. Python协程(真才实学,想学的进来)

    真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒. --蒙田<蒙田随笔全集> *** 上篇论述了关 ...

  8. day38 各种队列、Event事件、协程、猴子补丁

    1.各种队列 我们已经学习了队列这种存取值的方法,我们以前使用的队列是可以进行进程间通信的(IPC),但是今天学习的这两种队列是不能进行进程间通信的,只能进行线程间的通信 这两种队列分别是先进后出式队 ...

  9. 协程----greenlet模块,gevent模块

    1.协程初识,greenlet模块 2.gevent模块(需要pip安装) 一.协程初识,greenlet模块: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线 ...

随机推荐

  1. PE440

    一些证明,推荐复制入atom观看 首先我们考虑这个T(n)是什么,我们可以列出递归式: (definition:T) T(0) = 1 T(1) = 10 T(n) = 10*T(n-1) + T(n ...

  2. 08.03 js _oop

    js 分6个基本类型: string boolean number undefind null   自定义对象 对象的种类: js内置的  ( 比如 string number ) 宿主对象 (比如 ...

  3. JQ图片轮播

    <script src="{staticurl action="jquery.js" type="js"}"></scri ...

  4. mysql ERROR 1045 (28000): 错误解决办法

    ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000 ...

  5. .NET LINQ 投影运算

    投影运算      投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性. 通过使用投影,您可以构建依据每个对象生成的新类型. 您可以映射属性,并对该属性执行数学函数. 还可以在 ...

  6. .NET 获取类型中的属性

    解决方案      通过反射的方式获取类型中的所有属性. 引用命名空间 using System.Reflection; 实体类 public class User { private string ...

  7. 关于Ajax工作原理

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  8. VIM退出命令

    注意:这些命令前面都有一个冒号: 当编辑完文档,准备退出Vi返回到shell时,能够使用以下几种方法之一. 在命令模式中,连按两次大写字母Z,若当前编辑的文档曾被修改过,则Vi保存该文档后退出,返回到 ...

  9. 单位圆盘的全纯自同构群Aut B(0,1)

    利用Schwarz引理可以求出单位圆盘$B(0,1)$的全纯自同构群${\rm Aut}B(0,1)$. 任取$a\in B(0,1)$,记$$\varphi_{a}(z)=\frac{a-z}{1- ...

  10. mvc+webapi 项目架构

    首先项目是mvc5+webapi2.0+orm-dapper+ef codefirst+redis+quartz.net+actionmq. 1.项目框架层次结构: 这个mvc项目根据不同的业务和功能 ...