Вам пять. Пару лет назад вы едва могли ходить и говорить. А сейчас вы поймете одну из самых сложных концепций в программировании – потоки. Начнем.
Однопоточный JavaScript. Наш любимый звездный kid.
У нас есть ребенок по имени JavaScript. Он отличается от других детей. Он особенный.
Нет, он не может летать.
В то время как другие дети многопоточны, он однопоточен. Это не плохо и не хорошо. Это его выбор. Но однопоточность делает JavaScript непохожим на других детей.
Когда обычные дети хотят сделать себе чай и посмотреть YouTube, они могут делать это одновременно:
Но когда наш особенный ребенок JavaScript хочет сделать себе чай и посмотреть YouTube, ему приходится делать это последовательно – сначала чай, потом YouTube:
Наш ребенок ждет, когда действие будет выполнено, и только после этого он приступает к выполнению следующего. Другие дети могут выполнять действия одновременно и не ждать выполнения предыдущих.
Этим же отличаются однопоточные языки от многопоточных. Однопоточные языки могут выполнять только одну задачу одновременно, многопоточные могут выполнять много задач одновременно (параллельно).
Но почему однопоточные языки, такие же особенные дети как JavaScript, не могут быть обычными и выполнять задачи параллельно?
Все дело в том, как работают потоки.
Собаки. Горки. И потоки.
В программировании поток – это процесс выполнения задач. Представьте себе водную горку – это поток, выполнение задачи – это процесс спуска по горке.
Да, это собака.
Когда одна собака спускается с водной горки, другие собаки должны подождать, пока она спуститься до конца. Потому что есть правило – спускаться по водной горке одновременно может только одна собака. Значит каждый поток одновременно может выполнять только одну задачу. Все остальные задачи не могут выполняться пока эта задача не закончит выполнение.
Как мы уже знаем, наш особенный ребенок JavaScript – однопоточный. Поэтому он может выполнять только одну задачу одновременно. Это отличает его от других детей. И это иногда создает проблемы.
Аквапарк.
Представьте, что наш особенный ребенок вырос и решил открыть аквапарк для собак. Но не обычный аквапарк. Он решил построить его по "однопоточной философии".
Так как JavaScript однопоточный, аквапарк тоже однопоточный. В нем есть только одна водная горка. Собаки не могут развлекаться на других горках. Им приходится стоять в очереди и ждать, пока каждая собака перед ними закончит кататься.
Смотря на это, я могу сказать, что нашего особенного ребенка JavaScript ждет полное фиаско в бизнесе. Представьте, если одна собака будет спускаться с горки целый час. Другие собаки ждут. Инвесторы злятся. Собачьи спасатели не могут уйти домой. Катастрофа.
“Но почему JavaScript не может быть таким же как другие дети – многопоточным?”
Потому что он сделал свой выбор. Он особенный ребенок и мы должны смириться с его однопоточностью. И как бы другие ни старались имитировать в нем многопоточность с помощью workers, он останется однопоточным.
Он останется нашим особенным ребенком.
PS: ни одна собака не пострадала в процессе написания этой статьи.
Кстати,
Каждую неделю я читаю 30+ статей на тему разработки, отбираю 3 самых ценных и пишу о них в моем Telegram канале. Если не хочешь пропустить следующую подборку, приходи в @nickondev