В это верят многие разработчики. Разрушим миф!

Если вы точно знаете, как работают промисы в Javascript, вы, скорее всего, не узнаете ничего нового в этой статье.

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

Что такое многопоточность

Многопоточность существовала с раннего начала современной разработки (под современной я имею в виду появление C и языка, которые мы знаем сегодня). Но как мы можем определить многопоточность?

Многопоточность — это наличие одной программы, параллельно выполняющей несколько задач в одно и то же время.

Это самое простое определение, которое я смог придумать.

Здесь следует запомнить два ключевых слова: «одна программа» и «параллельно».

Единая программа

В отличие от многопроцессорной обработки (дублирование одной и той же программы и параллельное выполнение нескольких экземпляров), многопоточность — это один уникальный экземпляр программы, выполняющей несколько задач. одновременно. Это также означает, что если вы убьете свою программу, все потоки умрут вместе с ней.

В параллели

Многопоточность позволяет запускать параллельно несколько задач. В случае двух конкретных задач, выполнение каждой из которых занимает 20 секунд, если они выполняются в двух разных потоках, общее количество времени составит 20 секунд. Если вы решите запустить их последовательно, общее количество времени составит 40 секунд.

Время очень теоретическое и может варьироваться в зависимости от среды.

Ограничения многопоточности

Обычно многопоточность ограничена количеством ядер (и потоков) вашего процессора. А также насколько интенсивно они используются в определенное время. Если все потоки используются другими программами, ваш ЦП будет ставить в очередь входящие потоки.

Что такое обещания

Теперь, когда мы знаем больше о многопоточности, давайте немного поговорим о обещаниях.

К концу этого раздела вы должны немного лучше понимать, куда мы идем.

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

Здесь снова у нас есть два важных ключевых слова: «поставлен в очередь в цикле обработки событий» и «основной поток […] простаивает»

В очереди в цикле событий

Поскольку Javascript является однопоточным (не может достаточно гибко работать с этим), инженерам пришлось придумать способ ожидания выполнения асинхронного кода (HTTP-запрос , запрос к базе данных, …) без блокировки основного потока.

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

Основной поток простаивает (стек вызовов пуст)

Помните, я сказал, что JavaScript является однопоточным? (Вы, скорее всего, делаете сейчас!)

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

Давайте рассмотрим быстрый пример кода, прежде чем продолжить:

Сначала он будет печатать от 0 до 4 или от 10 до 14?

Ответ от 10 до 14!

Несмотря на то, что setTimeout установлен на 0 мс (и должен выполняться мгновенно), это асинхронная операция, и она отправляется в очередь событий. Как только стек вызовов станет пустым, механизм JavaScript начнет подбирать асинхронный код в очереди событий и очищать очередь.

Ограничения асинхронного кода

Основным ограничением асинхронного кода будет насколько способен ваш ЦП для однопоточных операций. Некоторые процессоры оптимизированы для многопоточности (много ядер, но более медленная тактовая частота), а некоторые другие более дружественны к однопоточности (меньшее количество ядер, но очень высокая тактовая частота).

Другим ограничением также может быть способ разработки и архитектуры вашего приложения. Убедитесь, что ваш код соответствует рекомендациям и позволяет выполнять асинхронный код. Если вам действительно нужен параллельно исполняемый код, возможно, NodeJS — неподходящая технология для вас (и это совершенно нормально)

В чем тогда разница между многопоточным и асинхронным кодом?

Я думаю, что вы, вероятно, уже поняли это, но давайте сделаем краткий обзор.

Многопоточность — это распределение параллельных задач, которые должны выполняться разными потоками вашего процессора. Он ограничен количеством ядер (и потоков), которые есть у вашего ЦП (и тем, сколько доступно).

Асинхронный код предназначен дляпостановки рабочей нагрузки в очередь для выполнения, когда стек вызовов пуст. Все последовательно и ничего не выполняется параллельно. Его ограничение в основном заключается в том, насколько способен ваш процессор для однопоточного выполнения.

NodeJS может быть многопоточным

Действительно существует способ многопоточного кода NodeJS. Я написал об этом отличную статью! Посмотрите, если хотите узнать больше о параллельной разработке в NodeJS!



Я надеюсь, что эта статья сделала ее более понятной для вас, и что вам понравилось читать ее так же, как мне понравилось ее писать.

Не стесняйтесь оставлять аплодисменты или подписываться!

Увидимся в следующем!

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу