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功能部分代码 谢谢。
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来实现跨系统的协程支持