Как мы можем заблокировать событие l oop? - PullRequest
0 голосов
/ 22 апреля 2020

Я изучил событие l oop в Node.Js, оно работает асинхронно и неблокирует обработку запроса. Есть ли способ, чтобы мы могли заблокировать выполнение события l oop?

1 Ответ

1 голос
/ 22 апреля 2020

Существует множество способов заблокировать событие l oop. Некоторые способы блокируют его только на некоторое время (например, используя синхронный файловый ввод / вывод), а некоторые способы блокируют его навсегда.

Например, это блокирует его навсегда:

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() l oop работает до тех пор, пока flag не изменит значение. Пока l oop работает, событие l oop блокируется. Есть setTimeout(), который хочет сработать в течение 1 секунды, но он не может фактически вызвать свой обратный вызов, пока интерпретатор не вернется к событию l oop. Но оно не вернется к событию l oop, пока не будет выполнено while() l oop. Это тупик, который приводит к бесконечности l oop, а событие l oop постоянно блокируется.

setTimeout() не может вызвать свой обратный вызов до тех пор, пока while l oop не будет завершен, а while l oop не завершится sh, пока setTimeout() не выполнит свою перезвонить. Тупик, бесконечный l oop.


Блокирует его на время, пока все файловые операции продолжаются и вся обработка файлов:

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
    }
}
...