gpt4 book ai didi

javascript - Node.js 非阻塞特性

转载 作者:搜寻专家 更新时间:2023-10-31 23:10:12 26 4
gpt4 key购买 nike

我是 node.js 的新手,仍在努力理解其背后的哲学。据我了解,node.js 仅在一个进程中运行,而 php 则为每个请求打开一个进程\线程。虽然您可以说 Node 对于 i/o 是“非阻塞的”,但它对请求是阻塞的(请求堆积,因为每个新请求都没有新线程)并且理论上如果您编写了 node.js 应用程序这不会快速处理您遇到麻烦的每个请求。

我的问题是 - 我如何判断某个请求的处理时间是否太长,以至于它会长时间阻止所有其他请求并影响我的应用程序的性能?

我知道服务器上的所有“繁重”操作(数据库查询、文件系统搜索)都是通过回调完成的,因此不能阻塞 Node 。但是,如果服务器为处理请求而同步完成的所有其他操作花费的时间太长怎么办?

例如 - 服务器需要向响应写入大量 html。那么会发生什么?

Node 程序员如何知道他是否对某个请求做了太多(以阻塞方式),是经验、直觉还是有关于如何做的明确指南?

最佳答案

关于同步代码和异步代码之间的界限在哪里,没有明确的指导方针,更多的是应用程序流程的问题。异步操作应该是首选,因为它们允许 Node.js 主进程同时开始处理其他请求。

也就是说,简单地为每个函数使用回调并不是解决方案,因为一段代码是这样的:

function sum(a, b, callback){
var sum = a + b;
callback(sum);
}

sum(2,3, function(sum){
console.log(sum);
}

仍然是同步的。使其异步 process.nextTick可以这样使用:

function sum(a, b, callback){
var sum = a + b;
process.nextTick(function(){
callback(sum);
});
}

sum(2,3, function(sum){
console.log(sum);
}

一般的经验法则是避免同步递归计算、重循环和 IO 操作。

查明请求是否花费太长时间并因此会影响性能不能如此笼统地定义,因为限制是特定于应用程序的。这些请求是通过在应用程序上运行性能测试来定位的。

关于javascript - Node.js 非阻塞特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com