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

之前为了写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,似乎也是有一些的。嗯,又一个扑空了的蓝海,唉。

 

Comments

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

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

发表评论

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