2012-06-03 53 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时,它给出了一个错误 –