2012-06-03 138 views
4

在我的快速服務器中,有一些功能需要作爲子進程運行,否則它們將綁定服務器,其他人將無法訪問它。他們已經在使用異步模塊,但他們仍然綁定服務器,除非它們作爲子進程運行。在快遞服務器中產生子進程

一個問題是將req和res參數傳遞給它們。

這怎麼辦?

回答

12

使用child_process.fork,您可以發送消息到子進程。

編輯:我錯誤地建議將reqres作爲消息參數傳遞給子進程。這是不可能的,因爲往返於子進程的所有消息都轉換爲JSON。相反,你可以在你的服務器中保留某種類型的隊列。以下僅作爲一個例子,你可能想要的東西更強大的:

child.js:

process.on('message', function(message) { 
    // Process data 

    process.send({id: message.id, data: 'some result'}); 
}); 

server.js:

var child_process = require('child_process'); 
var child = child_process.fork(__dirname + '/child.js'); 
var taskId = 0; 
var tasks = {}; 

function addTask(data, callback) { 
    var id = taskId++; 

    child.send({id: id, data: data}); 

    tasks[id] = callback; 
}; 

child.on('message', function(message) { 
    // Look up the callback bound to this id and invoke it with the result 
    tasks[message.id](message.data); 
}); 

app.post('/foo', function(req, res) { 
    addTask('some data', function(result) { 
     res.send(result); 
    }); 
}); 

它更復雜一些,但它應該管用。你可能會很快從這樣一個系統發展而來,並且可以通過一個適當的隊列更好地服務。

+0

當我嘗試傳遞req時,它給出了一個錯誤 –