为什么node.js是asynchronous的?

没有人真正问过这个问题(从我提出的所有“build议”中,在我问到这里之前,也从中寻找)。

那么为什么node.js是asynchronous的呢?

从我在一些研究中推论出来的:

像PHP和Python这样的语言是脚本语言(我可能是错误的脚本语言的实际语言),而JavaScript不是。 (我想这是源于JS不编译的事实?)

Node.js在单线程上运行,而脚本语言使用multithreading。

asynchronous意味着无状态,连接是持久的,而同步是(几乎)相反的。

也许答案是在上面的某个地方find的,但是我还不确定。

我的第二个也是最后一个与这个话题有关的问题是:

JavaScript可以变成同步语言吗?

PS。 我知道你们中的一些人会问“你为什么要让JS同步?” 在你的答案中,但事实是,我没有。 我只是问这些types的问题,因为我确信有更多的人在那里,而不仅仅是我自己曾经想过这样的问题。

Node.js在单线程上运行,而脚本语言使用multithreading。

不是技术上的。 Node.js使用多个线程,但只有一个执行线程。 后台线程是用来处理IO,使所有的asynchronous善良工作。 有效地处理线程是一个非常痛苦的事情,所以下一个最好的select是在事件循环中运行,以便代码可以在IO上阻塞后台线程时运行。

asynchronous意味着无状态,连接是持久的,而同步是(几乎)相反的。

不必要。 你可以很容易地在一个asynchronous系统中保存状态。 例如,在Javascript中,可以使用bind()将其绑定到函数,从而在函数返回时显式保留状态:

 function State() { // make sure that whenever doStuff is called it maintains its state this.doStuff = this.doStuff.bind(this); } State.prototype.doStuff = function () { }; 

asynchronous意味着不等待操作完成,而是注册监听器。 这一直发生在其他语言,特别是需要接受用户input的任何东西。 例如,在Java GUI中,您不会阻止等待用户按下button,而是通过GUI注册侦听器。

我的第二个也是最后一个与这个话题有关的问题是:

JavaScript可以变成同步语言吗?

从技术上讲,所有的语言都是同步的,甚至是Javascript。 但是,在asynchronousdevise中,Javascript工作起来更好,因为它被devise成单线程的。

基本上有两种types的程序:

  • CPU绑定 – 使其更快的唯一方法是获得更多的CPU时间
  • IO绑定 – 花费大量的时间等待数据,所以更快的处理器将无关紧要

video游戏,数字计算器和编译器都是CPU绑定的,而Web服务器和GUI通常是IO绑定的。 Javascript是相对较慢的(因为它有多复杂),所以它不能在CPU绑定的情况下竞争(相信我,我已经写了我公平分享的CPU绑定的Javascript)。

JavaScript不是用类和对象来编码,而是用简单的函数来编码。 这在asynchronousdevise中效果很好,因为可以写入algorithm来递增地处理数据.IO(尤其是networkingIO)速度非常慢,因此在数据包之间有相当多的时间。

假设您有1000个活连接,每个连接每毫秒传递一个数据包,处理每个数据包需要1微秒(非常合理)。 我们还假设每个连接发送5个数据包。

在单线程的同步应用程序中,每个连接都将被串联处理。 总的时间是(5 * 1 + 5 * .001)* 1000毫秒,或〜5005毫秒。

在单线程asynchronous应用程序中,每个连接都将并行处理。 由于每个数据包需要1毫秒,处理每个数据包需要0.001毫秒,因此我们可以处理数据包之间的每个连接的数据包,因此我们的公式变为:1000 * .001 + 5 * 1毫秒,或者〜6毫秒。

这个问题的传统解决scheme是创build更多的线程。 这解决了IO问题,但是当连接数量增加时,内存使用(线程花费大量内存)和CPU使用率(在1个内核上复用100个线程比1个内核上的1个线程更难)。

但是,有缺点。 如果您的Web应用程序碰巧也需要进行大量的数据处理,那么您就是SOL,因为当您处理数字时,连接需要等待。 线程解决了这个问题,因为当数据准备好等待IO的线程时,OS可以交换出CPU密集型任务。 此外,node.js绑定到一个单一的核心,所以你不能利用你的多核处理器,除非你旋转多个实例和代理请求。

JavaScript不编译成任何东西。 它在运行时被“评估”,就像PHP和Ruby一样。 因此,它就像PHP / Ruby一样是一种脚本语言。 (它的官方名称实际上是ECMAScript)。

Node遵守的“模型”与PHP / Ruby有点不同。 Node.js使用一个“事件循环”(单线程),其目标是获取networking请求并快速处理它们,如果由于某种原因遇到需要一段时间的操作(API请求,数据库查询 – 基本上任何涉及IO(input/输出)的东西),它将这个关联传递给后台“工作者”线程,然后在工作线程等待完成这个长时间的任务时去做其他事情。 当发生这种情况时,主要的“事件循环”将取得结果并继续处理它们。

遵循线程模型的PHP / Ruby。 本质上,对于每个传入的networking请求,应用程序服务器都会启动一个isloated线程或进程来处理请求。 与这个模型相比,这并不能很好地扩展,Node的方法被认为是它的核心优势之一。

asynchronous意味着无状态,连接是持久的,而同步是(几乎)相反的。

否。同步指示从第一个到最后一个自然顺序完成。 asynchronous指令意味着如果一个程序stream程中的一个步骤需要相当长的时间,程序将继续执行操作,并在完成时简单地返回到该操作。

JavaScript可以变成同步语言吗?

JavaScript中的某些操作是同步的。 其他人是asynchronous的。 例如:

阻止操作:

 for(var k = 0; k < 1; k = k - 1;){ alert('this will quickly get annoying and the loop will block execution') alert('this is blocked and will never happen because the above loop is infinite'); 

asynchronous:

 jQuery.get('/foo', function (result) { alert('This will occur 2nd, asynchronously'); }); alert('This will occur 1st. The above operation was skipped over and execution continued until the above operation completes.'); 

JavaScript可以变成同步语言吗?

Javascript不是一个“asynchronous语言”; 相反, node.js有很多asynchronousAPI 。 asynchronous内核是API的一个属性,而不是语言。 在javascript中创build和传递函数的便捷性使传递callback函数变得非常方便,这是在asynchronousAPI中处理控制stream的一种方法,但是JavaScript本身并没有任何asynchronous。 Javascript可以轻松支持同步API。

为什么node.js是asynchronous的?

Node.js支持asynchronousAPI,因为它是单线程的。 这使得它可以高效地pipe理自己的资源,但是要求长时间运行的操作是非阻塞的,asynchronousAPI是一种允许用很多非阻塞操作来控制stream的方法。