Skip to content

Commit

Permalink
ru: some fixes in blocking-vs-non-blocking guide (#2781)
Browse files Browse the repository at this point in the history
1. Fixed index.md link for russian locale
2. Fixed some errors and typos
3. Added anchors to headers
  • Loading branch information
Artyom Popov authored and alexandrtovmach committed Nov 19, 2019
1 parent d2b77e3 commit 3a485f9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
36 changes: 18 additions & 18 deletions locale/ru/docs/guides/blocking-vs-non-blocking.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,36 @@ title: Блокирующие и Неблокирующие Вызовы
layout: docs.hbs
---

# Обзор Блокирующих и Неблокирующих Вызовов
# <!--overview-of-blocking-vs-non-blocking-->Обзор Блокирующих и Неблокирующих Вызовов

Этот обзор рассматривает разницу между **блокирующими** и **неблокирующими**
вызовами в Node.js. Он ссылается на цикл событий (event loop) и библиотеку libuv,
однако предварительное знание этих тем не требуется. Предпологается, что
однако предварительное знание этих тем не требуется. Предполагается, что
читатели имеют базовое понимание JavaScript и паттерна обратных вызовов (callback)
в Node.js.

> Обозначение "I/O" (Ввод/Вывод) в первую очередь ссылается на взаимодействие
> с системным диском и сетью при поддержке [libuv](https://libuv.org/).
## Блокирование
## <!--blocking-->Блокирование

О **блокировании** говорят, когда выполнение JS кода в Node.js
приостановленно до тех пор, пока не завершится работа сторонней операции (например, чтение
какого-нибудь файла). Так происходит, потому что цикл событий не может продолжить исполнение JavaScript,
приостановлено до тех пор, пока не завершится работа сторонней операции (например, чтение
какого-нибудь файла). Так происходит потому, что цикл событий не может продолжить исполнение JavaScript,
так как работает **блокирующая** операция.

В Node.js медленно исполняемый JS код не принято называть **блокирующим**,
если причиной тому высокая нагрузка кода на процессор, а не ожидание завершения
сторонней операции. Синхронные методы в стандартной библиотеке Node.js,
которые используют libuv, наиболее часто применяемые **блокирующие** операции.
которые используют libuv наиболее часто применяемые **блокирующие** операции.
Нативные модули также могут иметь **блокирующие** методы.

Все I/O методы в стандартной библиотеке Node.js предоставляют свои асинхронные версии,
которые являются **неблокирующими** и принимают функции обратного вызова
в качестве аргумента. Некоторые методы также имеют свои **блокирующие** аналоги.
Названия таких методов закнчиваются на `Sync`.
Названия таких методов заканчиваются на `Sync`.

## Сравнение Кода
## <!--comparing-code-->Сравнение Кода

**Блокирующие** методы исполняются **синхронно**, а **неблокирующие** методы
исполняются **асинхронно**.
Expand All @@ -41,7 +41,7 @@ layout: docs.hbs

```js
const fs = require('fs');
// исполнение кода заблокированно, пока файл не будет полностью считан
// исполнение кода заблокировано, пока файл не будет полностью считан
const data = fs.readFileSync('/file.md');
```

Expand All @@ -58,13 +58,13 @@ fs.readFile('/file.md', (err, data) => {
**блокирует** исполнение любого нижеследующего кода, до тех пор, пока
весь file.md не будет считан. Обратите внимание, если синхронная версия кода сгенерирует
исключение, его нужно обработать, иначе процесс Node.js "упадёт". В асинхронном варианте
выбор сгенерировать исключение или нет оставлено на усмотрение программиста.
выбор сгенерировать исключение или нет — оставлен на усмотрение программиста.

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

```js
const fs = require('fs');
// исполнение кода заблокированно, пока файл не будет полностью считан
// исполнение кода заблокировано, пока файл не будет полностью считан
const data = fs.readFileSync('/file.md');
console.log(data);
moreWork(); // функция будет исполнена, после console.log
Expand All @@ -88,7 +88,7 @@ JavaScript может продолжаться, не дожидаясь окон
дожидаться окончания чтения файла и других системных вызовов — ключевое
инженерное решение, которое обеспечивает высокую пропускную способность Node.js.

## Конкурентность и Пропускная Способность
## <!--concurrency-and-throughput-->Конкурентность и Пропускная Способность

Исполнение JavaScript в Node.js является однопоточным. Поэтому, говоря о конкурентности
(параллельности вычислений) в Node.js, подразумевают, что после того, как цикл событий обработал синхронный код,
Expand All @@ -97,15 +97,15 @@ JavaScript может продолжаться, не дожидаясь окон

В качестве примера возьмем запросы к веб-серверу. Допустим, обработка сервером одного запроса
занимает 50мс. Из этих 50мс, 45мс уходит на операции чтения/записи в базу данных.
С базой данных можно взаимодействовать и **асинхронно**. При таком подходе, на каждый запрос
С базой данных можно взаимодействовать и **асинхронно**. При таком подходе на каждый запрос
к веб-серверу **неблокирующая** асинхронная операция высвободит 45мс для обработки других
запросов, а это существенная разница.

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

## Опасность смешивания Блокирующего и Неблокирующего Кода
## <!--dangers-of-mixing-blocking-and-non-blocking-code-->Опасность смешивания Блокирующего и Неблокирующего Кода

Существуют паттерны, которые следует избегать при работе с I/O. Взглянем на пример:

Expand All @@ -118,7 +118,7 @@ fs.readFile('/file.md', (err, data) => {
fs.unlinkSync('/file.md');
```

В вышеукзанном примере метод `fs.unlinkSync()`, с высокой вероятностью, будет исполнен до
В вышеуказанном примере метод `fs.unlinkSync()` с высокой вероятностью будет исполнен до
`fs.readFile()`. Это приведет к удалению файла до его прочтения. Лучше переписать
этот код в **неблокирующем** виде, что гарантирует правильный порядок исполнения методов:

Expand All @@ -134,9 +134,9 @@ fs.readFile('/file.md', (readFileErr, data) => {
```

В последнем примере **неблокирующий** вызов метода `fs.unlink()` расположен внутри функции обратного вызова
`fs.readFile()`. Такой подход гарантирует парвильную последовательность операций.
`fs.readFile()`. Такой подход гарантирует правильную последовательность операций.

## Дополнительные рессурсы
## <!--additional-resources-->Дополнительные ресурсы

* [libuv](https://libuv.org/)
* [О Node.js](https://nodejs.org/en/about/)
2 changes: 1 addition & 1 deletion locale/ru/docs/guides/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ layout: docs.hbs

## Ключевые концепции Node.js

* [Блокирующие и Неблокирующие Вызовы](/en/docs/guides/blocking-vs-non-blocking/)
* [Блокирующие и Неблокирующие Вызовы](/ru/docs/guides/blocking-vs-non-blocking/)
* [The Node.js Event Loop, Timers, and `process.nextTick()`](/en/docs/guides/event-loop-timers-and-nexttick/)
* [Don't Block the Event Loop (or the Worker Pool)](/en/docs/guides/dont-block-the-event-loop/)
* [Timers in Node.js](/en/docs/guides/timers-in-node/)
Expand Down

0 comments on commit 3a485f9

Please sign in to comment.