2012-08-27 52 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。它可以讓你啓動童工流程。它主要設計用於多核場景中的負載平衡,但可能對您有所幫助。