盗賊の極意

Feed Rss

我心爱的协程coroutine也不是秘技了

03.15.2014, 未分类, by , 4,512 views.

之前为了写node.js的服务器端,根据回调式的编程风格,设计了一种OperationNode(简称Op,而不是On,防歧义)概念,然后用它写了很多代码。不过后来我的服务器端就越写越慢,越来越没有干劲,明明目标很清楚,实现也完全不难,但就是不想动手。怎么办呢,我停下来仔细品味了一下当时的心情,好象是因为代码写不优雅,自己不甘心,觉得写起来没劲,或者是隐约感觉到自己在一条错误的道路上行走,本能的不愿意快走。

那好,”怎么写你(我)才会开心嘛,你写个样子出来看看呗“。这是我设计代码的时候经常用到的一种战术,就是先写一些(有时是很多甚至全部)上层代码,感觉这么写舒服了,再去想怎么实现底层,才能让刚才写的代码生效。我看了看我的卡牌游戏里经常出现的询问玩家是否怎样怎样的AskYesNoOp,至今为止的语法是这样的:

// 询问意向,时限10秒,超时等于选否

this.game.pushOp( new AskYesNoOp( opts, "是否发动场地效果?", 10 ), function( error, result ){

    if ( result ){

        /* ... */

    }else{

        /* ... */

    }

} );

选是的话,后面还要套很多层逻辑,而且每层逻辑都要新写一个Op类,挺痛苦的。理想的写法显然是

var result = asyncAskYesNo( opts, "...", 10 ) ;

switch ( result ){

case ASK_YES_NO_RESULT_YES:

    break;

case ASK_YES_NO_RESULT_NO:

case ASK_YES_NO_RESULT_TIMEOUT:

    break;

}

所以我需要异步功能同步写法。

这种写法我以前常常写的,在lua里,这个叫coroutine,协程。

稍微搜了一下,node.js里就有Fibers库来实现协程功能嘛,安装也很简单,功能也和lua的一样。好,接下来就是逐步割爱换下我的Op,再设计一套coroutine的包装了。估计最后是Op管理大的逻辑,coroutine负责随处可见的琐碎异步。

以前我是听说C++语言里没有协程,所以还挺开心自己掌握了一个少数人可用的秘技,后来搜了一下服务器部分的coroutine,似乎也是有一些的。嗯,又一个扑空了的蓝海,唉。

 

我心爱的协程coroutine也不是秘技了 有 2 条回应

  1. 2014-03-15 在 17:07 FreeKnight

    C++11加入的携程和匿名函数= = Lua很早就支持了。哈哈哈,不算秘籍啦~~

    回复
    • 2014-03-19 在 16:19 基拉铃妖

      看node.js的协程库时,还顺便学到了库里示例包装类用到的那个“future模式”。赚好多~哈哈

      不愧是我在lua时代就爱用的协程,在现在的node.js项目里小改几行就实现了异步事件同步写法,开心!
      我太强啦,哇哈哈哈哈哈~(难得这么开心,让我笑一会儿先)

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>