node.js - 单线程nodejs“并行”运行?
问题描述
下面的代码片段,
rl = require('readline').createInterface({
input: process.stdin
})
rl.on('line', (s) => {
console.log(s)
rl.close()
})
for (i = 0; i < 2e9; i++) {}
console.log(i)
运行它,快速键入几个字符,例如abcd
然后在循环结束Enter
之前点击。for
由于for
循环占据了主线程,我所期望的输出将是:
2000000000
abcd
abcd
为什么控制台会在下面显示一些东西?
abcd
2000000000
abcd
解决方案
所以问题是nodejs不是单线程的。至少在内部它不是。是的,它对你来说是单线程的,但它本身不是。因此,当您编写代码的第二部分时
rl.on('line', (s) => {
console.log(s)
rl.close()
})
它不在主线程上运行。它有一组工作线程,它不给你访问权限,而是在内部维护。所以它有单独的线程,实际上为你做 IO。因此输出。这家伙解释得非常完美 - https://www.youtube.com/watch?v=8aGhZQkoFbQ
进一步阅读Javascript 事件循环
推荐阅读
- powershell - Invoke-RestMethod: POST Assoc-Array 使用 JSON 到 WebService (System.Collections.Hashtable)
- c# - 我们需要处理 IDbDataParameter 吗?
- sql - 自定义列上的 Where 子句
- javascript - 将表格标题与数据对齐
- vb.net - X509Certificate2 仅在以管理员身份添加到当前用户存储时临时工作
- javascript - 使用stimulusjs手动强制触发以嵌套形式选择的更改事件
- php - simplexml_load_file():http://website.com/feed:563:解析器错误:未定义实体“nbsp”
- javascript - D3.js制作条形图,其中x轴代表日期,y轴代表当天的睡眠时间
- mysql - SQL 触发器(插入前)
- html - 如何在 Syncfusion SfListView 中绑定选中项