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

Sharing Node.js environment between different processes?

本文关键字:Node js 环境 共享 之间 进程      更新时间:2023-09-26

按照与rubygem Spork相同的思路,您是否可以分叉一个节点进程,并使其基本上成为当前环境的完整克隆?

我所说的"完全克隆"是指这个克隆的/子环境/进程可以重用现有的require.cache,这样子进程就不必再次需要相同的模块(有时是痛苦的)性能。例如,require('lib-a')需要2秒才能加载。当你在子进程中调用require('lib-a')时,它是即时的(也就是使用require.cache或类似的东西),你是如何做到这一点的?

这方面的一个用例是加快节点express/connect 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套接字对吗?这将有助于搜索。

节点进程是长寿命的,所以我不认为启动时间是特别重要的。这是节点哲学的核心。话虽如此,您可能需要查看集群模块。它允许您启动童工流程。它主要是为多核场景中的负载平衡而设计的,但可能会对您有所帮助。