如果我在Node中有一个长时间运行的进程,如何在仍然保持对新用户请求的响应的同时运行该进程?
在其他语言中,例如Java,我们可以简单地启动一个守护进程(后台)线程并在其上运行该进程。但是使用Node,如果它是真正的单线程,那么它是如何工作的?
答案 0 :(得分:1)
有一个事件循环的概念。当您的节点进程执行任何I / O操作(即从db等读取)时,它将当前请求放入事件循环,并且线程移动到下一个请求。完成I / O后,线程从事件循环中获取callback
,并响应用户。
由于这种范例,node.js能够在一个线程中处理许多请求,而不是为每个请求创建一个线程。
答案 1 :(得分:1)
JavaScript是非阻塞的,例程以异步方式运行,允许在上一次执行完成之前进行处理。这样,如果您有多个用户请求,它们将同时执行(显然达到CPU的容量)。
尝试此代码,例如
function myUserRequest(order, cb) {
// to simulate some lengthy operation we use a timeout
setTimeout(function () {
console.log(order + ' calling callback');
cb();
}, 100);
}
myUserRequest(1, function () {/*some stuff to do after operation is done*/});
myUserRequest(2, function () {
console.log('do stuff after this function is finished in a callback');
});
console.log('i am being executed already');
输出将是:
i am being executed already
2 calling callback
do stuff after this function is finished in a callback
1 calling callback
请注意回调的顺序,这些函数不会以调用它们的任何特定顺序执行,而是以CPU调度它们的方式执行。
因此,只要CPU能够跟上这些请求,您的用户请求就会在此时进入并执行。
希望这有帮助
此外,我可以建议你看看Mozilla Dev Network这些人有很多与java脚本相关的知识。
答案 2 :(得分:1)
在节点中,您可以生成子进程来运行计算,将输入数据传递给它,并且它可以返回计算结果。不,你不能多线程你的应用程序,但仍有一些可能性。
请注意,生成节点进程相当昂贵(.04秒加上库),因此您可能希望让一些计算工作者一直运行并将工作分配出来;例如,请参阅worker-farm包。