node.js - 异步编程如何在单线程编程模型中工作?

标签 node.js asynchronous

我在浏览 node.js 的细节时才知道,它支持异步编程,尽管它本质上提供了一个单线程模型。

在这种情况下如何处理异步编程?是不是就像runtime自己创建和管理线程,但是程序员不能显式创建线程?如果有人能指出一些资源来了解这一点,那就太好了。

最佳答案

现在跟我说吧:异步编程并不一定意味着多线程。

Javascript 是单线程运行时 - 您根本无法在 JS 中创建新线程,因为语言/运行时不支持它。

Frank 说得对(虽然很迟钝) 用英语:当事情进入您的应用程序时,有一个主事件循环来处理。因此,“处理这个 HTTP 请求”将被添加到事件队列中,然后在适当的时候由事件循环处理。

当您调用异步操作(例如 mysql 数据库查询)时,node.js 会向 mysql 发送“嘿,执行此查询”。由于此查询需要一些时间(毫秒),node.js 使用 MySQL 异步库执行查询 - 回到事件循环并在等待 mysql 回复我们的同时在其中执行其他操作 .就像处理那个 HTTP 请求一样。

编辑:相比之下,node.js 可以简单地等待(什么都不做)让 mysql 回到它。这称为同步调用。想象一家餐厅,您的服务员将您的订单提交给厨师,然后在厨师做饭时坐下并转动他/她的拇指。在餐厅中,比如在 node.js 程序中,这种行为是愚蠢的——你有其他顾客饿了,需要被服务。因此,您希望尽可能异步,以确保一个服务员(或 node.js 进程)为尽可能多的人提供服务。

编辑完成

Node.js 使用 C 库与 mysql 通信,因此从技术上讲,这些 C 库可以产生线程,但在 Javascript 中,您不能对线程进行任何操作。

关于node.js - 异步编程如何在单线程编程模型中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8982489/

相关文章:

javascript - AWS Lambda 调用函数并不总是返回

javascript - 如何在 node.js 中获取所有 memcached 数据?

node.js - 出现错误 : getaddrinfo ENOTFOUND when using node-soap

javascript - 返回异步数据然后在 Node.js 中同步导出

javascript - gulp.watch() 不适用于 Jade

javascript - 在 node.js 中,我正在发出 POST 请求,在收到 POST 请求的响应之前,函数正在向端点发送空格

javascript - 如何在 Node 的嵌套函数中使用回调?

ios - swift realm 在后台线程中插入数组在main中使用

javascript - 遍历 Q 中的 promise

asynchronous - 如何在 Angular2 循环/映射中执行异步 HTTP 请求并修改原始循环数组?