Рубрики
Без рубрики

Блокировка и неблокирующие ноты.

Операции блокировки Операция блокировки происходит, когда выполнение операций JavaScript является импульсным и должны дождаться операции без JavaScript для завершения выполнения. Без JavaScript …

Автор оригинала: 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 работает в одном потоке, но он предоставляет набор различных примитивов ввода/вывода в его библиотеке, которая проходит асинхронно, тем самым обеспечивая код, который работает одновременно.