对于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. 多重网格法简介(Multi Grid)

    原文链接 多重网格法是一种用于求解方程组的方法,可用于插值.解微分方程等. 从专业角度讲多重网格法实际上是一种多分辨率的算法,由于直接在高分辨率(用于求解的间隔小)上进行求解时对于低频部分收敛较慢,与 ...

  2. 【ZJOI2007】棋盘制作 BZOJ1057

    Description 国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对 ...

  3. BestCoder Round #90

    有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先 ...

  4. Odd Even Linked List

    Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...

  5. 各大安卓应用市场APP上传提交与收录

    360 提交网址 应用宝 提交网址 百度 提交网址 91 提交网址 安卓 提交网址 PP助手 提交网址 小米 提交网址 华为 提交网址 OPPO 提交网址 魅族 提交网址 乐视 提交网址 豌豆荚 提交 ...

  6. Openstack4j 在 Maven 中的构建

    什么是 Openstack4j ? OpenStack的官方SDK是基于Python语言的,对于Java程序猿来说,将Python翻译过来未免麻烦.在Openstack官方的Wiki中(戳我直达),我 ...

  7. SQL创建字段信息(表值函数)

    ALTER FUNCTION [dbo].[fnt_SplitString] ( @p1 varchar(Max), ) ) RETURNS @Table_Var TABLE ( c1 varchar ...

  8. Linux运维(3年以内)

    1.精通shell编程,熟练应用awk,sed,grep,strace,tcpdump等常用命令; 2.精通windows server,linux,mssql,mysql,熟悉网络,cisco,ju ...

  9. Emmet,让你爱上敲代码

    原文链接:http://m.blog.csdn.net/article/details?id=53484535 不错 —— 由 都不要欺负我 分享 Emmet 是一个可用在许多流行文本编辑器上的极大简 ...

  10. Swift - 生成随机颜色(Extension UIColor)

    在开发中,我们有时需要生成一些随机的颜色.但 UIColor 没有提供方法或属性来直接获取随机颜色,这里对其进行扩展,方便使用. 1,扩展UIColor,增加随机颜色属性 1 2 3 4 5 6 7 ...