javascript - 为什么 node.js 是异步的?

标签 javascript multithreading node.js asynchronous synchronous

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

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

根据我的一些研究得出的结论:

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

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

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

也许在上面所说的某个地方找到了答案,但我仍然不确定。

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

可以把 JavaScript 做成同步语言吗?

PS。我知道你们中的一些人会问“为什么要让 JS 同步?”在你的回答中,但事实是我没有。我只是问这些类型的问题,因为我相信除了我自己之外,还有更多的人想过这些问题。

最佳答案

Node.js runs on a single thread whilst scripting languages use multiple threads.

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

Asynchronous means stateless and that the connection is persistent whilst synchronous is the (almost) opposite.

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

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

异步意味着不等待操作完成,而是注册一个监听器。这种情况在其他语言中一直发生,尤其是任何需要接受用户输入的语言。例如,在 Java GUI 中,您不会阻止等待用户按下按钮,而是向 GUI 注册一个监听器。

My second and last question related to this topic is this:

Could JavaScript be made into a synchronous language?

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

基本上有两种程序:

  • CPU 受限 - 使其运行得更快的唯一方法是获得更多 CPU 时间
  • IO 受限 - 花费大量时间等待数据,因此更快的处理器无关紧要

视频游戏、数字运算器和编译器受 CPU 限制,而 Web 服务器和 GUI 通常受 IO 限制。 Javascript 相对较慢(因为它非常复杂),因此它无法在 CPU 密集型场景中竞争(相信我,我已经编写了相当一部分 CPU 密集型 Javascript)。

Javascript 不是根据类和对象进行编码,而是根据可以串在一起的简单函数进行编码。这在异步设计中非常有效,因为可以编写算法以在数据进入时增量处理。IO(尤其是网络 IO)非常慢,因此数据包之间存在相当长的时间。

示例

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

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

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

解决这个问题的传统方法是创建更多线程。这解决了 IO 问题,但是当连接数增加时,内存使用(线程消耗大量内存)和 CPU 使用(将 100 个线程多路复用到 1 个内核比 1 个线程在 1 个内核上更难)。

但是,也有缺点。如果您的 Web 应用程序碰巧还需要进行一些繁重的数字运算,那么您就是 SOL,因为当您在运算数字时,连接需要等待。线程解决了这个问题,因为当数据准备好等待 IO 的线程时,操作系统可以交换 CPU 密集型任务。此外,node.js 绑定(bind)到单核,因此您无法利用多核处理器,除非您启动多个实例和代理请求。

关于javascript - 为什么 node.js 是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17607280/

相关文章:

javascript - 获取请求在 html 中呈现未定义

asp.net - 每个请求 asp.net 单线程

node.js - angularjs $cookieStore SyntaxError : JSON. 解析:意外字符

javascript - 页面刷新时更新文本框

javascript - 在 Javascript 中将任何类型的字符串更改为标题大小写

ios "has active assertions beyond permitted time:"异步任务崩溃

javascript - 如何在aws lambda函数中使用setInterval

node.js - 将 Angular 2 应用程序部署到 EC2

javascript - 单击时更改输入值不起作用

从 void * 转换时的 C++ 多态性问题