我想知道将数据库或其他异步调用传递给一个或多个工作进程是否有任何好处。具体来说,我正在使用 heroku 和 postgres。我已经阅读了很多关于 node.js 的内容以及如何构建您的服务器以便事件循环不被阻塞并且智能架构不会使传入请求的挂起时间超过 300 毫秒左右。
假设我有以下内容:
app.get('/getsomeresults/:query', function(request, response){
var foo = request.params.query;
pg.connect(process.env.DATABASE_URL, function(err, client, done) {
client.query("SELECT * FROM users WHERE cat=$1", [foo],
function(err, result){
//do some stuff with result.rows that may take 1000ms
response.json({some:data})
});
});
});
由于 postgresql 本质上是异步的,因此创建一个工作进程来处理初始数据库调用的结果集有什么真正的好处吗?
最佳答案
在另一个进程中运行异步函数不会给您带来任何好处,因为真正的工作(运行 SQL 查询)已经在另一个进程 (postgres) 中运行。基本上,异步/面向事件的设计模式是一种轻量级流程管理器,适用于在您的流程之外运行的事物。
但是,我在您的评论中注意到回调函数中的处理确实占用了大量 CPU 时间(如果确实如此)。这部分代码确实受益于在另一个进程中运行 - 它释放了主进程来接受传入的请求。
有两种方法来构建这样的代码。要么在单独的进程中运行异步函数(这样回调就不会阻塞),要么只在单独的进程中将回调的相关部分作为函数运行。
关于javascript - 在 node.js 中使用工作进程/后台进程与异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32834353/