我浏览了node.js的详细信息,了解到它支持异步编程,尽管它本质上提供了一个单线程模型.

在这种情况下,异步编程是如何处理的?它是否像运行时本身创建和管理线程,但程序员不能显式创建线程?如果有人能给我指一些资源来了解这一点,那就太好了.

推荐答案

现在跟我说:async programming does not necessarily mean multi-threaded.

Javascript是一个单线程运行时——您无法在JS中创建新线程,因为语言/运行时不支持它.

Frank用英语说得很对(尽管有些迟钝):有一个主事件循环,可以在你的应用程序中处理事情.因此,"处理这个HTTP请求"将被添加到事件队列中,然后在适当的时候由事件循环处理.

当您调用异步操作(例如,mysql db查询)时, node .js向mysql发送"嘿,执行这个查询".由于此查询将需要一些时间(毫秒),因此需要使用 node .js使用MySQL异步库执行查询——返回事件循环并在那里执行something else次,同时等待MySQL返回给我们.比如处理HTTP请求.

Edit:相比之下, node .js could只是等待(什么也不做)mysql返回.这叫做同步呼叫.想象一下,在一家餐厅里,你的服务员向厨师提交了你的订单,然后坐下来,在厨师做饭的时候转动他/她的拇指.在餐厅,就像在一个 node .在js程序中,这样的行为是愚蠢的——你还有其他客户饿了,需要服务.因此,您希望尽可能地异步,以确保一个服务员(或node.js进程)为尽可能多的人提供服务.

Edit done

node .js使用C库与mysql通信,所以从技术上讲,这些C库可能会产生线程,但在Javascript中,你不能用线程做任何事情.

Node.js相关问答推荐

我的位置也移动时左右拖动谷歌 map

Sveltekit停靠的应用程序找不到从Build导入的包

Mongoose-不会更新数组中的属性值

Node.js分页返回空数组

如何呈现ejs.renderFile中包含的子模板?

try 插入重复的邮箱时,mongoDB DuplicateKey 错误未定义

使用 playwright 获取页面中同一 url 的所有响应

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

npm install 在 Mac 上的 Node-gyp 构建错误

Node.js |如何在微服务之间转发标头?

Winston http 日志(log)级别的行为与 info 不同

部署云功能 Firebase/Stripe 时出错

仅显示用户在 Reactjs 中使用服务器端发布的帖子是 Node Js、Mongodb

在安装 tensorflow 时遇到问题

通过 npm 导入 Sass

如何从 npm 注册表中删除 npm 包?

Node.js 17.0.1 Gatsby 错误-数字信封 routine ::不支持 ... ERR_OSSL_EVP_UNSUPPORTED

处理快速异步中间件中的错误

如何断言不为空?

Mongoose:模式与模型?