http://alexeypetrushin.github.io/synchronize/docs/index.html 在开发中,由于功能越来越多,再回头看各模块的代码实在对回调写法有点吐了(不同意的也别拍砖,不是来辩论的), 就尝试了n次js实现的流程控制模块,async,q,step,甚至想开harmony模式用co实现,但在真实的使用中,还是有点麻烦
终于给我发现了这个synchronize.js库,是基于node-fibers实现的,在写法上对原来的改动较少,同时兼容也很不错,不像许多 fiber库都mongodb和mocha的兼容都不行
我尝试了看node-fibers的c++实现,但这块功底很弱,没有看懂。。 希望有强者出现,帮我解读一下node-fibers的实现原理,我目前的理解是它重写了ObjectTemplate注入了Fiber模块 使用了coroutine实现 同时在windows平台上使用的是线程代替纤程来实现相同的效果
只能读到这里,希望有强者能再深入一下,特别是如何在Fiber模块wrap以后,里面可以实现yield功能部分代码 谢谢。
而且在我的机器上,使用node-fiber改写的nodeclub的首页拉取贴子要比异步实现快10%
c艹果断快 不过我也折腾了一下c的拓展,只能说累,可能不习惯V8的数据类型之类的。 如果不是CPU密集型,我觉得不如多起几个cluster比较实在省事
感觉楼主好厉害
@simon4546 不要@ngot 了 他会推荐你fibjs的(^o^)/~
fibjs的第三方库是个大问题,暂时还不会考虑fibjs
fibjs,为什么不能像node-fibers一样,加一个js函数来wrap一下实现同步。 那么多的第三方库都是自已实现,是要自已做个生态系统呀,这个想法太。。。。。不好实现了吧
再顶一下
刷完了别人的,还是刷一下自已的
顶一下
总的来说fiber的实现就是一个上下文切换。每个fiber有一个独立的栈,一般是256K。 启动fiber时,相当于创建一个context对象保存当前栈的上下文,然后切换到新的栈,并执行一个callback; yield的时候,保存当前的栈上下文,然后切换到旧的context resume的时候,再次切换到之前保存的上下文,就酱。
关于上下文切换,linux有默认的实现 https://linux.die.net/man/3/swapcontext ,windows可以通过汇编实现(其实任何系统都可以通过汇编实现)。 我一直在用这个实现: https://github.com/laverdet/node-fibers 它使用了libcoro来实现跨系统的协程支持
为什么不试试bluebird加async/await
@simon4546 https://github.com/fibjs-modules/sync 包一下就好了,很简单的