2012-08-27 53 views
2

沿着与rubygem Spork相同的路线,您是否可以分叉节点进程并使其基本上成为当前环境的完整克隆? “完整克隆”我的意思是这个克隆/子进程环境/进程可以重用现有的require.cache,所以子进程不需要再次需要相同模块的性能冲击(有时是痛苦的)。比如说,require('lib-a')需要2秒加载。当你在子进程中调用require('lib-a')时,你如何做到这一点,它是即时的(也就是使用require.cache或类似的东西)?在不同进程之间共享Node.js环境?

一个用例是为了加快节点express/connect HTTP服务器的启动时间。在更复杂的应用程序中,您可能需要预先设置大量模块,有时需要花费一两秒时间才能完成require所有这些应用程序(并非寻找有关如何延迟加载模块的信息,我也在进行优化,但它有其局限性)。

相关叉勺代码是这样的:

https://github.com/sporkrb/spork/blob/master/lib/spork/forker.rb

我不知道到底是什么它与像Marshal.dump(yield, @child_io)Marshal.load(@child_io)代码做什么,但它看起来像它以某种方式复制整个环境到子进程。通过这样做,Spork制作了它,所以你可以运行1个“主”Rails服务器,并“分”它来运行测试,所以你不必等待(有时10秒)让Rails服务器启动。你怎么能在节点上做到这一点?可能吗?

更新

这被认为是一个unix socket pair?这将有助于搜索。

回答

1

节点进程的目的是长寿命的,所以我不认为启动时间是特别优先考虑的。这是节点哲学的核心。话虽如此,你可能想看看cluster module。它可以让你启动童工流程。它主要设计用于多核场景中的负载平衡,但可能对您有所帮助。