Javascript 为什么node.js是异步的?

Javascript 为什么node.js是异步的?,javascript,multithreading,node.js,asynchronous,synchronous,Javascript,Multithreading,Node.js,Asynchronous,Synchronous,实际上没有人问过这个问题(从我得到的所有“建议”以及我在这里问之前的搜索中) 那么为什么node.js是异步的呢 根据我经过研究得出的结论: 像PHP和Python这样的语言都是脚本语言(我可能对脚本语言的实际语言有所误解),而JavaScript则不是。(我想这是因为JS没有编译?) Node.js在单个线程上运行,而脚本语言使用多个线程 异步意味着无状态,连接是持久的,而同步则(几乎)相反 也许答案就在上面的某个地方,但我还是不确定 我的第二个也是最后一个与本主题相关的问题是: JavaSc

实际上没有人问过这个问题(从我得到的所有“建议”以及我在这里问之前的搜索中)

那么为什么node.js是异步的呢

根据我经过研究得出的结论:

像PHP和Python这样的语言都是脚本语言(我可能对脚本语言的实际语言有所误解),而JavaScript则不是。(我想这是因为JS没有编译?)

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

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

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

我的第二个也是最后一个与本主题相关的问题是:

JavaScript是否可以成为一种同步语言


另外,我知道你们中的一些人会在回答中问“为什么要使JS同步?”但事实是我不想。我只是问这些类型的问题,因为我确信有比我更多的人考虑过这些问题。

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

Node遵循的“模型”与PHP/Ruby有点不同。Node.js使用一个“事件循环”(单线程),其唯一目标是获取网络请求并非常快速地处理它们,如果出于任何原因遇到需要一段时间的操作(API请求、数据库查询——基本上是任何涉及I.O.(输入/输出))的操作它将该任务传递给后台“worker”线程,并在worker线程等待长任务完成时执行其他操作。当这种情况发生时,主“事件循环”将获取结果并继续处理它们

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

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

不可以。同步指令是按自然顺序从头到尾完成的。异步指令意味着,如果程序流中的一个步骤需要相对较长的时间,程序将继续执行操作,并在完成后返回到该操作

JavaScript是否可以成为一种同步语言

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


阻塞操作:

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');
JavaScript是否可以成为一种同步语言

Javascript不是一种“异步语言”;相反,node.js有很多异步API。异步性是API的属性,而不是语言的属性。javascript中创建和传递函数的方便性使得传递回调函数变得非常方便,这是异步API中处理控制流的一种方法,但javascript本身并没有异步性。Javascript可以轻松支持同步API

为什么node.js是异步的

Node.js支持异步API,因为它是单线程的。这允许它高效地管理自己的资源,但要求长时间运行的操作是非阻塞的,异步API是一种允许通过大量非阻塞操作控制流的方法

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

从技术上讲不是。Node.js使用多个线程,但只有一个执行线程。后台线程用于处理IO,以使所有异步线程正常工作。有效地处理线程是一件非常痛苦的事情,所以下一个最好的选择是在事件循环中运行,这样代码就可以在IO上阻塞后台线程时运行

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

不一定。您可以很容易地在异步系统中保留状态。例如,在Javascript中,可以使用
bind()
this
绑定到函数,从而在函数返回时显式保留状态:

function State() {
    // make sure that whenever doStuff is called it maintains its state
    this.doStuff = this.doStuff.bind(this);
}
State.prototype.doStuff = function () {
};
异步意味着不等待操作完成,而是注册侦听器。这种情况在其他语言中经常发生,尤其是需要接受用户输入的任何语言。例如,在JavaGUI中,您不会阻止等待用户按下按钮,而是向GUI注册一个侦听器

我的第二个也是最后一个与本主题相关的问题是:

JavaScript是否可以成为一种同步语言

从技术上讲,所有语言都是同步的,甚至Javascript也是如此。然而,Javascript在异步设计中工作得更好,因为它被设计为单线程

基本上有两种类型的程序:

  • CPU受限-使其运行更快的唯一方法是获得更多的CPU时间
  • IO绑定-花费大量时间等待数据,因此更快的处理器无关紧要
视频游戏、数字处理器和编译器受CPU限制,而web服务器和GUI通常受IO限制。Javascript相对较慢(因为它有多复杂),所以它无法在CPU受限的场景中竞争(相信我,我已经编写了相当多的CPU受限Javascript)

Javascript不使用类和对象进行编码,而是使用可以串在一起的简单函数进行编码。这在异步设计中非常有效,因为可以编写算法,在数据进入时以增量方式处理数据。IO(尤其是网络IO)是
function State() {
    // make sure that whenever doStuff is called it maintains its state
    this.doStuff = this.doStuff.bind(this);
}
State.prototype.doStuff = function () {
};