Автор оригинала: Onu Monday Emmanuel.
Работа блокировки возникает, когда выполнение операций JavaScript является импульсным и должна дождаться операции без JavaScript для завершения выполнения. Операциями без JavaScript я имею в виду операции, такие как чтение или запись данных в файл, создавая сетевую заявку, чтение или сохранение данных в базу данных e.t.c.
Операции блокировки происходит в Node.js, поскольку JavaScript в наиболее основной форме является синхронным, блокирующим, однопоточным языком, который может выполнять только несколько операций одновременно, и поскольку Node.js – это кроссплатформенная среда выполнения JavaScript, она работает его операции в одном процессе без создания нового потока для каждого запроса.
Давайте посмотрим на фрагмент кода ниже;
01: const fs = require('fs'); 02: 03: //reads a file in a synchronous and blocking way 04: const readFileSynchronously = (filepath) => { 05: console.log('***Reading file***'); 06: const data = fs.readFileSync(filepath, {encoding: 'utf8'}); 07: console.log(data); 08: console.log('***Data read***'); 09: return data; 10: } 11: 12: const calculateArraySum = (arr) => { 13: return arr.reduce((acc, curr) => acc + curr ) 14: } 15: 16: readFileSynchronously('./text.txt'); 17: 18: const sum = calculateArraySum([1, 2, 3, 4, 5, 6, 7]); 19: console.log('Sum: ', sum); 20:
Текстовый файл содержит следующий текст
This is a text file. You can write anything here.
Запуск вышеуказанного кода отображается следующее на терминале
***Reading file*** This is a text file. You can write anything here. ***Data read*** Sum: 28
Давайте понять, что здесь происходит. Линия 4 создает функцию readfilesynchronially Отказ Метод FS (файловой системы) Readfilesync на линия 6 Выполняет синхронное чтение файлов и блокирует всю другую работу, пока она не завершит чтение файла.
Глядя на выход кода, линия 16 называет readfilesynchronially Функция, которая печатает Линия 5 Затем ждет, чтобы данные были прочитаны, распечатайте его на линия 7 затем печатает линия 8 Отказ Во всех этого, линия 18 ждет, чтобы позвонить на функцию, чтобы завершить перед выполнением и линия 19 печатает сумму массива.
Код выглядит простым и прямым, но он имеет недостаток третьей строки, блокируя выполнение дополнительного кода JavaScript. Представьте, что если у нас есть супер большой файл, который может занять несколько секунд для чтения, то выполнение дополнительного кода JavaScript придется дождаться данных для чтения данных. Между тем, CalculatearRaysum Функция не должна беспокоиться с данными, которые читаются из файла, и поэтому нет точек ожидания данных, которые будут прочитаны перед выполнением.
Node.js предоставляет набор асинхронных примитивов ввода/вывода в своем стандартном библиотеке, который предотвращает блокировку кода JavaScript из другого дополнительного кода JavaScript. В целом, Node.js библиотеки написаны с использованием асинхронных, неблокирующих парадигм.
Давайте переписаним блокирующей операции для работы асинхронно
01: const fs = require('fs'); 02: 03: const readFileAsynchronously = (filepath) => { 04: console.log('***Reading file***'); 05: fs.readFile(filepath, {encoding: 'utf8'}, (err, data) => { 06: console.log(data); 07: console.log('***Data read***'); 08: }); 09: } 10: 11: const calculateArraySum = (arr) => { 12: return arr.reduce((acc, curr) => acc + curr ) 13: } 14: 15: readFileAsynchronously('./text.txt'); 16: 17: const sum = calculateArraySum([1, 2, 3, 4, 5, 6, 7]); 18: console.log('Sum: ', sum);
Запуск вышеуказанного в среде Node.js даст вывод ниже
***Reading file*** Sum: 28 This is a text file. You can write anything here. ***Data read***
Посмотрите на вывод, линия 18 Выполняет и распечатывает сумму до отображения файла данных на линия 6 Отказ Это произошло потому, что метод ФС readfile Выступает асинхрованную операцию и не блокирует выполнение другого кода JavaScript, но вместо этого он принимает функцию (популярно упоминается как Callback Функция), как это третий аргумент и вызывает функцию с данными, когда это сделано для чтения текста файл или вызывает его с ошибкой, если она сталкивается с ошибкой.
Таким образом, Node.js работает в одном потоке, но он предоставляет набор различных примитивов ввода/вывода в его библиотеке, которая проходит асинхронно, тем самым обеспечивая код, который работает одновременно.