Nick Bull
Nick Bull Blog

Nick Bull Blog

Что значит “JavaScript однопоточный”?

Что значит “JavaScript однопоточный”?

Объясняю, будто вам пять лет

Nick Bull's photo
Nick Bull

Published on Dec 21, 2021

3 min read

Вам пять. Пару лет назад вы едва могли ходить и говорить. А сейчас вы поймете одну из самых сложных концепций в программировании – потоки. Начнем.

Однопоточный JavaScript. Наш любимый звездный kid.

У нас есть ребенок по имени JavaScript. Он отличается от других детей. Он особенный.

1.png

Нет, он не может летать.

В то время как другие дети многопоточны, он однопоточен. Это не плохо и не хорошо. Это его выбор. Но однопоточность делает JavaScript непохожим на других детей.

Когда обычные дети хотят сделать себе чай и посмотреть YouTube, они могут делать это одновременно:

2.png

Но когда наш особенный ребенок JavaScript хочет сделать себе чай и посмотреть YouTube, ему приходится делать это последовательно – сначала чай, потом YouTube:

3.png

Наш ребенок ждет, когда действие будет выполнено, и только после этого он приступает к выполнению следующего. Другие дети могут выполнять действия одновременно и не ждать выполнения предыдущих.

Этим же отличаются однопоточные языки от многопоточных. Однопоточные языки могут выполнять только одну задачу одновременно, многопоточные могут выполнять много задач одновременно (параллельно).

Но почему однопоточные языки, такие же особенные дети как JavaScript, не могут быть обычными и выполнять задачи параллельно?

Все дело в том, как работают потоки.

Собаки. Горки. И потоки.

В программировании поток – это процесс выполнения задач. Представьте себе водную горку – это поток, выполнение задачи – это процесс спуска по горке.

4.png

Да, это собака.

Когда одна собака спускается с водной горки, другие собаки должны подождать, пока она спуститься до конца. Потому что есть правило – спускаться по водной горке одновременно может только одна собака. Значит каждый поток одновременно может выполнять только одну задачу. Все остальные задачи не могут выполняться пока эта задача не закончит выполнение.

5.png

Как мы уже знаем, наш особенный ребенок JavaScript – однопоточный. Поэтому он может выполнять только одну задачу одновременно. Это отличает его от других детей. И это иногда создает проблемы.

Аквапарк.

Представьте, что наш особенный ребенок вырос и решил открыть аквапарк для собак. Но не обычный аквапарк. Он решил построить его по "однопоточной философии".

6.png

Так как JavaScript однопоточный, аквапарк тоже однопоточный. В нем есть только одна водная горка. Собаки не могут развлекаться на других горках. Им приходится стоять в очереди и ждать, пока каждая собака перед ними закончит кататься.

7.png

Смотря на это, я могу сказать, что нашего особенного ребенка JavaScript ждет полное фиаско в бизнесе. Представьте, если одна собака будет спускаться с горки целый час. Другие собаки ждут. Инвесторы злятся. Собачьи спасатели не могут уйти домой. Катастрофа.

8.png

“Но почему JavaScript не может быть таким же как другие дети – многопоточным?”

Потому что он сделал свой выбор. Он особенный ребенок и мы должны смириться с его однопоточностью. И как бы другие ни старались имитировать в нем многопоточность с помощью workers, он останется однопоточным.

Он останется нашим особенным ребенком.

9.png

PS: ни одна собака не пострадала в процессе написания этой статьи.

Кстати,

Каждую неделю я читаю 30+ статей на тему разработки, отбираю 3 самых ценных и пишу о них в моем Telegram канале. Если не хочешь пропустить следующую подборку, приходи в @nickondev

 
Share this