2015-11-04 50 views
0

我使用節點子進程模塊分流進程,從而卸載Express請求 - 響應週期中的一些進程。我基本上有一個快速的中間件下面的代碼:當父節點在節點中分出一個長時間運行的子進程時,請求處理器速度變慢

forkedProcess = child.fork(scriptFile); 
forkedProcess.send(messageToChild); 
forkedProcess.on('message',function(messageFromChild) {...}); 
子進程

然後,我有:

process.on('message', function(messageFromParent) {....}); 
process.send('messageToParent); 
process.exit(0); 

測試時,我決定插入一些虛擬的語句保住孩子進程運行這樣才能在此期間向父母發送另一個請求。問題是第二個請求需要很長時間才能響應。請求處理程序本身在第二個請求上不會啓動幾秒鐘。

我無法理解爲什麼?子進程不應該阻止父主要事件循環,顯然不會因爲第二個請求在第一個請求的子進程退出之前得到處理,但這需要很長時間。如果我從子進程獲取虛擬語句,則請求 - 響應循環正常工作。我模擬了測試用例,因爲子進程是根據一些開發者腳本動態生成的。這些開發者腳本不應該減慢主循環...顯然它確實。爲什麼?

+1

您每次收到一個新的請求時都會分叉一個子進程? – Vineet

+0

@ vineet.hawal是的,我爲每個請求分派。每個進程可能會根據請求類型而有所不同,但對於示例,我正在使用與分支相同的腳本進行基準測試。我也嘗試將數據作爲命令行參數發送給孩子,而不是通過child.send()發送,這也沒有幫助。 – Sam

回答

1

考慮到分叉過程本身的時間/內存成本,每次請求分叉並不是一個好主意。理想情況下,您應該在啓動時分叉所需的進程並在需要時發送/接收消息。 希望這會有所幫助

+0

有幫助是的。 Upvoted。讓我思考在正確的路線上,但儘管在保存過程啓動/關閉時間方面有優勢,是否存在上下文/範圍衝突問題?那麼,子進程處理程序將是一個app.local變量?然後,您對每個請求,只需發送,接收(從消息)該過程?您的建議非常有幫助,但並未回答問題,因爲放慢速度不是由於啓動新的子進程造成的......中間件啓動發生在分叉新進程之前的很多事情需要時間。 – Sam

+0

還有一條評論......在一個案例中,我必須爲每個請求分配一個新進程,因爲腳本/進程是在中間件中動態生成的......當然,當涉及靜態進程時,您的建議是可靠的必須處理不同的請求。或者您可能對如何管理基於動態生成的腳本的進程有一些建議?這些腳本(process.send在子項中)的輸出是生成的HTML,供主循環(父進程)讀取,然後作爲HTTP響應發送。 – Sam

相關問題