2016-04-25 53 views
3

我有一個node.js應用程序通過web請求接收文件,然後將轉換過程應用到此文件。由於該任務長時間運行,因此需要與主線程分開運行。node.js在子進程中運行函數?

目前我剛通過setTimeout()呼叫調用了必要的代碼。爲了將主應用程序與轉換過程隔離起來,我想將它移出到子進程中,因爲它運行時間很長,我想將主代碼與正在進行的工作分開(我是否擔心得太多?)。目前,我打電話:

const execFile = require('child_process').execFile; 
const child = execFile('node', './myModule.js', (error, stdout, stderr) => { 
    if (error) { 
    throw error; 
    } 
    console.log(stdout); 
}); 

這是在node.js中正確的方法,或者是有僅僅開始與模塊和指定PARAMS子進程,但沒有指定「節點」作爲可執行文件?

+0

你有這種方法的特殊問題嗎?這是啓動一個新進程的幾種方法之一('.spawn()'和'.exec()'是相似的)。我可以告訴你,你的'throw error'沒有什麼用處,因爲拋出一個常規的異步回調不能被捕獲到任何有用的地方,所以它與'return'不同。 – jfriend00

+0

您的長時間運行的進程是CPU限制還是IO限制?這個問題的答案在確定使用什麼方法時非常重要。 – JLRishe

+0

我基於上面的代碼,我有一個例子。我希望避免不得不明確引用「節點」命令,但如果這不是問題,那麼我很好。至於CPU/IO,這是一個視頻轉換過程,很可能兩者都有。儘管如此,我現在看到視頻轉換過程實際上是在引發一個外部過程(ffmpeg),所以我可能不需要擔心分叉(我以爲它使用的是庫)。 –

回答

2

剛纔看到node.js提供了'fork'函數,對於執行模塊,儘管它們需要被寫入,就好像它們正在等待命令行參數一樣,處理了process.argv數組。

命令調用中:

child_process.fork(modulePath[, args][, options]) 

更多細節here

在我的具體情況分叉可能沒有意義,因爲已經有一個叉由我正在使用的node.js庫。

+0

每個單獨的消息是否與另一個完全隔離?即如果我發送兩個消息給子進程fork,它們是否會完全獨立運行? – narruc