Javascript 为什么node.js是异步的?
实际上没有人问过这个问题(从我得到的所有“建议”以及我在这里问之前的搜索中) 那么为什么node.js是异步的呢 根据我经过研究得出的结论: 像PHP和Python这样的语言都是脚本语言(我可能对脚本语言的实际语言有所误解),而JavaScript则不是。(我想这是因为JS没有编译?) Node.js在单个线程上运行,而脚本语言使用多个线程 异步意味着无状态,连接是持久的,而同步则(几乎)相反 也许答案就在上面的某个地方,但我还是不确定 我的第二个也是最后一个与本主题相关的问题是: JavaScript是否可以成为一种同步语言Javascript 为什么node.js是异步的?,javascript,multithreading,node.js,asynchronous,synchronous,Javascript,Multithreading,Node.js,Asynchronous,Synchronous,实际上没有人问过这个问题(从我得到的所有“建议”以及我在这里问之前的搜索中) 那么为什么node.js是异步的呢 根据我经过研究得出的结论: 像PHP和Python这样的语言都是脚本语言(我可能对脚本语言的实际语言有所误解),而JavaScript则不是。(我想这是因为JS没有编译?) Node.js在单个线程上运行,而脚本语言使用多个线程 异步意味着无状态,连接是持久的,而同步则(几乎)相反 也许答案就在上面的某个地方,但我还是不确定 我的第二个也是最后一个与本主题相关的问题是: JavaSc
另外,我知道你们中的一些人会在回答中问“为什么要使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绑定-花费大量时间等待数据,因此更快的处理器无关紧要
function State() {
// make sure that whenever doStuff is called it maintains its state
this.doStuff = this.doStuff.bind(this);
}
State.prototype.doStuff = function () {
};