Цикл событий ведет себя по -разному с блокирующим кодомJavascript

Форум по Javascript
Ответить
Anonymous
 Цикл событий ведет себя по -разному с блокирующим кодом

Сообщение Anonymous »

Это не дубликат другого вопроса, как я искал здесь и не нашел ответа.

Код: Выделить всё

const fs = require('node:fs/promises');

// Schedule a timeout
setTimeout(() => {
console.log("set timeout callback is called!");
}, 10);

function consumeCpu(limit) {
console.log(`waiting a while (limit is ${limit})`);
let sum = 1;
for (let i = 0; i < limit; i++) {
sum += i;
}
}

let cycles = Number(process.argv[2]);

// Wait a while (blocking CPU)
consumeCpu(cycles);

// Run an async I/O action which will fail
(async () => {
try {
// This file does not exist, so an error will be thrown
let data = await fs.readFile('/tmp/123.txt');
} catch (err) {
console.log("err is: " + err);
}
})();

// Wait a while again (blocking CPU)
consumeCpu(cycles);

console.log("end of script");

// Let event loop start processing

Запуск кода
1. С небольшой задержкой блокировки:

Код: Выделить всё

node test.js 100

Выход:

Код: Выделить всё

waiting a while (limit is 100)
waiting a while (limit is 100)
end of script
err is: Error: ENOENT: no such file or directory, open '/tmp/123.txt'
set timeout callback is called!
Здесь, как и ожидалось, отказ от обещания обрабатывается до вызова тайм -аута , как и ожидалось.
2. С большой задержкой блокировки

Код: Выделить всё

node test.js 1000000000

Выход:

Код: Выделить всё

waiting a while (limit is 1000000000)
waiting a while (limit is 1000000000)
end of script
set timeout callback is called!
err is: Error: ENOENT: no such file or directory, open '/tmp/123.txt'
В этом случае вызовов тайм -аута выполняется до того, как отказ от обещания будет обрабатывается .
node.js версия
Я использую node.js v22.12.0. /> Вопрос < /strong> < /p>
Почему node.js ведут себя по -разному в зависимости от того, как долго основной код блокирует цикл события? Почему блокировка цикла событий с помощью вызова функции ConsumeCpu имеет значение?

Подробнее здесь: https://stackoverflow.com/questions/796 ... cking-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»