首页 > 解决方案 > 我们如何阻止事件循环?

问题描述

我研究过 Node.Js 中的事件循环,它以异步和非阻塞的方式工作来处理请求。有什么办法可以阻止事件循环的执行?

标签: node.jsevent-loop

解决方案


有很多方法可以阻止事件循环。有些方法只是暂时阻塞它(比如使用同步文件 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
    }
}

推荐阅读