node.js fiber实现,求教
发布于 10 年前 作者 simon4546 6947 次浏览 最后一次编辑是 8 年前 来自 问答

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功能部分代码 谢谢。

13 回复

而且在我的机器上,使用node-fiber改写的nodeclub的首页拉取贴子要比异步实现快10%

c艹果断快 不过我也折腾了一下c的拓展,只能说累,可能不习惯V8的数据类型之类的。 如果不是CPU密集型,我觉得不如多起几个cluster比较实在省事

感觉楼主好厉害

@wszgxa 厉害毛。。。 @xicilion @ngot 求解读

@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

回到顶部