Очень часто люди неправильно понимают эти две фразы. В этой короткой статье мы рассмотрим их и то, как они реализованы на разных языках программирования.

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

Параллелизм: мы делаем много вещей одновременно. Например, завязав обувь, мы не можем бегать.

Как это относится к программированию.

Компьютер поддерживает параллелизм с помощью потоков ОС. Если ваш компьютер состоит из 3-х ядерных ПК, это означает, что максимум 6 потоков могут выполняться параллельно. Несколько типичных примеров, связанных с тестированием, чтобы продемонстрировать разницу между ними:

  • Когда вы проводите нагрузочное тестирование для своих служб API, чтобы узнать, как ваша система реагирует, когда в секунду работает около 1 тысячи одновременных пользователей, вы выполняете параллелизм.
  • Но когда вы запускаете от 4 до 5 экземпляров браузера для сквозного тестирования приложения, вы делаете параллельную работу.

Большинство языков программирования поддерживают как параллелизм, так и параллелизм. Однако каждый из них делает это по-своему. Например, в Go у нас есть горутины, которые демонстрируют параллелизм и параллелизм. Язык определяет, когда они запускаются в нескольких потоках, зависит от нагрузки и доступных потоков ОС.

Но в Rust параллелизм и параллелизм - две разные вещи. Параллелизм можно сделать, создав потоки:

Однако, чтобы реализовать параллелизм в Rust, мы можем сделать это несколькими способами. Самый очевидный способ - использовать асинхронный, проще говоря с помощью async / await:

Чтобы добиться параллелизма в программировании, у нас есть несколько способов сделать это, в зависимости от поддержки библиотек или языка программирования:

  • Потоки ОС не требуют изменений модели программирования, что позволяет очень легко выразить параллелизм. Однако синхронизация между потоками может быть сложной, а издержки на производительность велики. Пулы потоков могут снизить некоторые из этих затрат, но этого недостаточно для поддержки массивных рабочих нагрузок с привязкой к вводу-выводу. → например нити Rust
  • Программирование, управляемое событиями, в сочетании с обратными вызовами, может быть очень эффективным, но, как правило, приводит к многословному, «нелинейному» потоку управления. За потоком данных и распространением ошибок часто трудно проследить. → например Кафка
  • Сопрограммы, как и потоки, не требуют изменений модели программирования, что упрощает их использование. Как и async, они также могут поддерживать большое количество задач. Однако они абстрагируются от низкоуровневых деталей, которые важны для системного программирования и разработчиков пользовательской среды выполнения. → например горутин
  • Модель акторов делит все параллельные вычисления на единицы, называемые акторами, которые общаются посредством передачи ошибочных сообщений, как и в распределенных системах. Модель актора может быть эффективно реализована, но она оставляет без ответа многие практические вопросы, такие как управление потоком и логика повторных попыток. → например фреймворк Akka, Erlang

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

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

~~ Надеюсь, это поможет ~~

~~ МИР ~~

использованная литература