Если блокирующие операции обрабатываются асинхронно и приводят к очереди блокирующих процессов, как это ускоряет асинхронное программирование? - PullRequest
0 голосов
/ 10 февраля 2019

Как и многие другие, я сталкивался с этой схемой, описывающей архитектуру NodeJS, и, поскольку я новичок в концепции асинхронного программирования, позвольте мне сначала поделиться с вами своим (возможно, ошибочным) пониманием архитектуры Node.

Node Architecture

Насколько мне известно, основной сценарий приложения сначала компилируется в двоичный код с использованием Chrome V8 Engine.После этого он перемещается через привязки Node.JS, которые являются низкоуровневым API, который позволяет обрабатывать двоичный код механизмом событий.Затем один цикл выделяется для цикла событий, который повторяется бесконечно, непрерывно выбирает первое (т. Е. Самое старое) событие в очереди событий и назначает рабочий поток для обработки события.После этого обратный вызов сохраняется в очереди событий, перемещается потоком цикла обработки событий в рабочий поток и - в зависимости от того, имела ли функция обратного вызова другую вложенную функцию обратного вызова - либо выполняется, либо выполняет любую функцию обратного вызова.это еще не было обработано.

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

Давайте рассмотрим пример:

var fs = require('fs');
fs.readFile('text.txt', function(err, data) {
    if(err) {
        console.log(err);
        } else  {
            console.log(data.toString());
        }
});
console.log('This will probably be finished first.');

В этом примере будет регистрироваться«Вероятно, сначала это будет завершено», а затем выводит данные файла text.txt, поскольку это функция обратного вызова функции fs.readFile ().Теперь я понимаю, что NodeJS имеет неблокирующую архитектуру, поскольку второй блок кода заканчивается раньше, чем первый, хотя он был вызван на более поздней стадии.Однако общее время, необходимое для завершения программы, все равно будет добавлением времени, которое требуется для завершения каждой функции, верно?

Единственный ответ, который я могу придумать, - это асинхронное программированиедопускает многопоточность, а синхронное программирование - нет.В противном случае асинхронная обработка событий на самом деле не будет быстрее, чем синхронное программирование, верно?

Заранее спасибо за ваши ответы.

...