node.js - 我们如何阻止事件循环?
问题描述
我研究过 Node.Js 中的事件循环,它以异步和非阻塞的方式工作来处理请求。有什么办法可以阻止事件循环的执行?
解决方案
有很多方法可以阻止事件循环。有些方法只是暂时阻塞它(比如使用同步文件 I/O),有些方法永远阻塞它。
例如,这将永远阻止它:
let flag = false;
setTimeout(() => {
// this callback never gets called
// because event loop is blocked
flag = true;
}, 1000);
while (!flag) {
console.log("still waiting")
}
// never get here
问题是while()
循环一直运行到flag
更改值为止。只要该 while 循环正在运行,事件循环就会被阻塞。有一个setTimeout()
希望在 1 秒内触发,但在解释器返回事件循环之前,它实际上不能调用它的回调。但是,在循环完成之前它不会回到事件循环while()
。这是一个死锁,导致无限循环并且事件循环被永久阻塞。
在循环完成setTimeout()
之前不能调用它的回调,while
并且在运行它的回调while
之前循环不会完成。setTimeout()
死锁,无限循环。
这会在所有文件操作和所有文件处理过程中阻止它一段时间:
setTimeout(() => {
// this doesn't get to run until all the synchronous file I/O
// finishes in the code below, even though the timer is set
// for only 10ms
console.log("finally got to run the timer callback");
}, 10);
let files = some array of files;
for (let file of files) {
let data = fs.readFileSync(file);
let lines = data.split("\n");
for (let line of lines) {
// do something
}
}
推荐阅读
- swiftui - 更改深色和浅色模式的按钮样式
- codeigniter - 在 null 上调用成员函数 view()
- django - Django 模板加载器在另一个应用程序中搜索模板
- postgresql - 我们可以在结果集中添加 COUNT 作为列吗?
- php - 添加 session_id 作为参数会导致我在 Apache/PHP 中出现 403 错误?
- deep-learning - 如何在长句中使用bert?
- python - 如何为 discord.py bot 中的命令添加高级订阅?
- java - RSA 公钥到 Node-Forge 公钥
- postgresql - 多个选择查询后,来自 Express 服务器的 Postgres 数据库查询超时
- javascript - Angular 8 - 无法使用指令 - 无法绑定,因为它不是已知属性