Node.js的阻塞与非阻塞【优信彩票购彩大厅】、同

你可能已经听说Node.js是“基于Chrome的V8 JavaScript引擎的异步JavaScript运行的”,并且它“使用事件驱动的非阻塞I / O模型,使其轻量级和高效”。但对某些人来说,这不是最好的解释,或许太过于概念化。

Node.js 究竟是什么?

首先要了解什么是Node.js?其次要知道Node.js究竟“异步”与“同步”有什么不同意思?还要讨论,“事件驱动”和“非阻塞”的含义是什么?

Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。

什么是Node.js

Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?对,您没有看错,就是Javascript。对于只在客户机上使用 JavaScript 的程序员而言,服务器端 JavaScript 可能是一个新概念,但这个概念本身并非遥不可及,因此为何不能在服务器上使用客户机上使用的编程语言?

Node只是一个环境或运行时,可以在浏览器之外运行普通的JavaScript。

什么是 V8?V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎。实际上,JavaScript 引擎负责解释并执行代码。Google 使用 V8 创建了一个用 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。V8 JavaScript 引擎并不仅限于在一个浏览器中运行。因此,Node 实际上会使用 Google 编写的 V8 JavaScript 引擎,并将其重建为可在服务器上使用。

我们可以使用它来构建桌面应用程序(使用像Electron这样的框架),编写Web或app服务器等等。

什么是回调?

回调是一种异步相当于一个函数。回调函数被调用在完成既定任务。Node大量使用了回调。Node所有的API写的都是支持回调的这样一种方式。例如,一个函数读取一个文件可能开始读取文件,并立即返回控制到执行环境 使得下一个指令可以马上被执行。一旦文件 I/O 完成,它会调用回调函数,同时传递回调函数,该文件作为参数的内容。因此不会有堵塞或等待文件I/O。这使得Node.js高度可扩展,因此可以处理大量的请求,而无需等待任何函数来返回结果

事件驱动

 

创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。

阻塞/非阻塞和同步/异步

Node.js特性

  • Node.js库的异步和事件驱动的API全部都是异步就是非阻塞。它主要是指基于Node.js的服务器不会等待API返回的数据。服务器移动到下一个API调用,Node.js发生的事件通知机制后有助于服务器获得从之前的API调用的响应。

  • 非常快的内置谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。

  • 单线程但高度可扩展 - Node.js使用具有循环事件单线程模型。事件机制有助于服务器在一个非阻塞的方式响应并使得服务器高度可扩展,而不是创建线程限制来处理请求的传统服务器。

  • 没有缓冲 - Node.js的应用从来不使用缓冲任何数据。这些应用只是输出数据在块中。

  • 许可证协议 - Node.js 在 MIT 协议 下发布

假设我们正在进行数据库调用以检索有关用户的属性,该调用需要时间,如果请求是“阻塞”,那么这意味着它将阻止我们的程序执行,直到调用完成。在这种情况下,我们发出了“同步”请求,它最终阻止了线程。

阻塞非阻塞

  同步/异步:   消息通知机制相关=>需要自己关注还是提供callback

  阻塞/非阻塞:等待消息时的状态=>是否可以干别的事情

  同步阻塞: 劫匪看着衰男把钱装好,不能干其他事情

  同步非阻塞:劫匪自己也到处搜索宝贝,但是还要不时跑回来看看钱装好没有。

  异步非阻塞:劫匪自己也到处搜索宝贝,衰男把钱装好了自动过来告诉劫匪好了

优信彩票购彩大厅,  异步阻塞:  劫匪就在那里傻等着,也不用管钱是否装好,衰男把钱装好了自动过来告诉劫匪好了 

  我们需要通过它提过的一些支持的库自己编写,无法像Apache那样直接运行,V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。本质上就是为文件系统、数据库之类的资源提供接口。

阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。   

例如:

我去买一本书,立即买到了,这就是非阻塞;
如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;

因此,同步操作会阻塞进程或线程,直到该操作完成,使线程处于“等待状态”。一个异步操作,在另一方面,是非阻塞的,它允许执行线程继续进行,无论操作完成所花费的时间或完成操作的结果如何,并且线程的任何部分都不会在任何时候进入等待状态。

模块化

正如我们买了一个智能手机那样,我们总是可以安装第三方软件来扩展手机的功能,听音乐,玩游戏,阅读等等。对于nodejs也是一样一样的。

本身nodejs相当一个平台,您也可以通过安装模块来扩展 Node 的功能。可用于 Node 的模块极大地 增强了这个产品,那些模块非常有用,将使用 Node 的开发人员通常会安装几个模块。因此,模块也就变得越来越重要,甚至成为整个产品的一个关键部分。

让我们看一下阻塞线程的同步调用的另一个例子。假设我们正在构建一个应用程序,用于比较两个Weather API的结果,以找出它们的差异化。我们以阻塞的方式调用Weather API One并等待结果。得到结果后,我们调用Weather API Two并等待其结果。

编写第一个node程序

代码示例:

// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(){
console.log("服务器运行了");
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

优信彩票购彩大厅 1

访问第一个服务器程序

  1.Localhost:8888  本机

  2.127.0.0.1:8888  本机

  3.192.168.1.30:8888  其他用户

本文由优信彩票购彩大厅发布于互联网资讯,转载请注明出处:Node.js的阻塞与非阻塞【优信彩票购彩大厅】、同

您可能还会对下面的文章感兴趣: