在不同进程之间共享Node.js环境?

时间:2012-08-27 23:45:00

标签: javascript ruby-on-rails node.js unix v8

与rubygem Spork一样,你能分叉一个节点进程并使它基本上是当前环境的完整克隆吗?

通过“完全克隆”我的意思是这个克隆/子环境/进程可以重用现有的require.cache,因此子进程不必采取重新要求相同的(有时是痛苦的)性能命中模块再次。比方说,require('lib-a')加载需要2秒。当您在子进程中调用require('lib-a')时,它是如何实现的,它是即时的(也就是使用require.cache或类似的东西)?

用例是加快节点快速/连接HTTP服务器的启动时间。在更复杂的应用程序中,您可以预先require大量模块,有时需要花费一两秒钟来require所有这些模块(不寻找有关如何延迟加载模块的信息,我是也进行了优化,但它有其局限性。)

相关的Spork代码是:

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 个答案:

答案 0 :(得分:1)

节点进程旨在长期存在,因此我认为创建时间并不是特别优先考虑的。这是节点哲学的核心。话虽这么说,你可能想看看cluster module。它允许您启动子工作进程。它主要用于多核场景中的负载平衡,但可能对您有所帮助。