2013-07-13 159 views
2

我有一個應用程序,其中有一部分計算密集型。我想將這個計算關閉到後臺任務,並在完成時通知主Node.js線程。我看到了一些可能的解決方案,包括Node Background Task,ClusterHub,Node Threads A-Go-Go,我確信還有其他解決方案。Node.js後臺任務

有沒有人有這方面的經驗,可以推薦一個解決方案?

感謝, 約翰

回答

0

過程是很簡單,這是不值得的麻煩與庫或NPM模塊來包裝它們,除非你有特殊的功能,比如後臺守護進程自動重生。內置的節點API「child_process」處理過程,並使用它很簡單:

var childProcess = require("child_process");   

var child = childProcess.spawn("/usr/bin/uname", ["-a"]); 

child.stdout.setEncoding("utf8"); 
child.stderr.setEncoding("utf8"); 

var stdoutBuffer = "", stderrBuffer = ""; 

child.stdout.on("data", function(data){stdoutBuffer += data;}); 
child.stderr.on("data", function(data){stderrBuffer += data;}); 

child.on("close", function(code) 
{ 
    //the process exited with code `code` 

    console.log("Stdout:", stdoutBuffer); 

    process.exit(code); //bubble up the exit code 
}); 

如果您需要訂單無關的異步控制流,可以考慮使用承諾(我建議故宮模塊「q '由kriskowal創建。)當你的任務開始時創建一個承諾,並在完成時(在「關閉」事件處理程序中解析/拒絕它)將爲完成後臺任務後執行後續任務提供一種乾淨而可預測的方式。

+1

值得注意的是,如果您要產卵的過程是另一個節點腳本,則可能需要使用child_process.fork()而不是spawn()。他們基本上做同樣的事情,但fork()會自動爲子進程設置一個通信通道,用於將數據發送回父進程。 –