Вопрос по node.js, asynchronous – Что такое неблокирующий или асинхронный ввод / вывод в Node.js?

117

В контексте механизмов Javascript на стороне сервера, что такое неблокирующий ввод / вывод или асинхронный ввод / вывод? Я вижу, что это упоминается как преимущество перед реализациями на стороне сервера Java.

Чтобы понять эту концепцию, полезно подумать о тегах сценария в среде браузера. У Закаса есть отличная статья об этом - первых нескольких разделов должно быть достаточно, чтобы объяснить концепцию блокировки:nczonline.net/blog/2010/08/10/what-is-a-non-blocking-script netpoetica

Ваш Ответ

2   ответа
276
Synchronous vs Asynchronous

выполняемому последовательно. Асинхронное выполнение относится к выполнению, которое не выполняется в последовательности, в которой оно появляется в коде. В следующем примере синхронная операция вызывает срабатывание предупреждений по очереди. В асинхронной операции, в то время какalert(2) выполняется вторым, это не так.

Synchronous: 1,2,3

alert(1);
alert(2);
alert(3);

Asynchronous: 1,3,2

alert(1);
setTimeout(() => alert(2), 0);
alert(3);

Blocking vs Non-blocking

Блокирование относится к операциям, которые блокируют дальнейшее выполнение до завершения этой операции. Неблокирующая ссылка относится к коду, который не блокирует выполнение. В приведенном примереlocalStorage является блокирующей операцией, так как она останавливает выполнение для чтения. С другой стороны,fetch это неблокирующая операция, так как она не останавливаетсяalert(3) от исполнения.

// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);
Advantages

Одним из преимуществ неблокирующих асинхронных операций является то, что вы можете максимально использовать как один процессор, так и память.

Synchronous, blocking example

Пример синхронных, блокирующих операций - это то, как некоторые веб-серверы, такие как Java или PHP, обрабатывают запросы ввода-вывода или сети. Если ваш код считывает данные из файла или базы данных, ваш код & quot; блокирует & quot; все после этого от выполнения. В этот период ваша машина удерживает память и время обработки потокаthat isn't doing anything.

Чтобы обслуживать другие запросы, пока поток остановлен, зависит от вашего программного обеспечения. То, что делает большинство серверных программ, - это создание большего количества потоков для удовлетворения дополнительных запросов. Это требует больше памяти и больше обработки.

Asynchronous, non-blocking example

Асинхронные неблокирующие серверы, подобные тем, которые сделаны в Node, используют только один поток для обслуживания всех запросов. Это означает, что экземпляр Node максимально использует один поток. Создатели разработали его исходя из того, что операции ввода-вывода и сетевых операций являются узким местом.

Когда запросы поступают на сервер, они обслуживаются по одному. Однако, когда обслуживаемому коду необходимо, например, запросить БД, он отправляет обратный вызов во вторую очередь.and the main thread will continue running (он не ждет). Теперь, когда операция DB завершается и возвращается, соответствующий обратный вызов извлекается из второй очереди и помещается в очередь в третьей очереди, где они ожидают выполнения. Когда механизм получает возможность выполнить что-то еще (например, когда стек выполнения очищается), он получает ответный вызов из третьей очереди и выполняет его.

@CharlieParkerHere's a post это больше касается внутренних элементов асинхронного механизма.
Это последнее.
@CharlieParker Да. Асинхронная операция выполняется параллельно вашему коду. Но обратный вызов, который "возвращается" результаты асинхронной операции ставятся в очередь для выполнения в основном коде, когда основной код не занят.
подождите, если это означает последнее, какие преимущества заключается в том, что не блокирует ввод-вывод PHP (например, ReactionPHP или что-то еще) по сравнению с блокирующим. все еще путают
Я не уверен, что понимаю ваш второй абзац подBlocking in PHP, Вы говорите, что "хотя PHP обычно блокирует ввод-вывод, это не так, потому что ОС автоматически создает потоки операций ввода-вывода".? Или вы говорите, что это не проблема в PHP, потому что PHP автоматически создает новый поток для каждого запроса, поэтому один заблокированный запрос не останавливает всю среду PHP? (Я предполагаю последнее ..)
4
var startTime = new Date().getTime();
var getEndTime = () => {
    var tempEndTime = new Date().getTime();
    var second = (tempEndTime - startTime)/1000
    return `took ${second} sec...to finish\n`
}

console.log('1: start App', getEndTime())
setTimeout(()=>{
    console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())

// console -> Process Order:  1 -> 3 -> 2

Code example

Похожие вопросы