Если вы читали мои предыдущие статьи, то, возможно, знаете, что я фанат параллельных вычислений. Так что это причина. Если у вас есть плата за ПК 💻 и если этот ПК имеет два или более ядер (в настоящее время почти все процессоры имеют более одного ядра), очевидно, вы должны платить за эти ядра, даже если вы не потребляете. В данном случае, я думаю, вы разработчик. В противном случае не вам решать, будете ли вы потреблять все эти ядра 😛. Так что, если у вас есть деньги за это, почему бы вам не потреблять их. Ядра дорогие 💸.

Все еще в замешательстве 😕. Позволь мне объяснить. Во-первых, давайте посмотрим, сколько ядер у вас есть на вашем ПК 💻. Если вы находитесь на компьютере с Windows, просто откройте диспетчер задач и перейдите на вкладку «Производительность». Вы можете легко узнать, сколько ядер у вас есть.

Если вы работаете в Linux, просто введите nproc, вы получите количество ядер, которые у вас есть, или введите lscpu, и вы сможете найти дополнительную информацию о своем процессоре. Когда я писал эту статью, на моем ноутбуке было 4 ядра. Это означает, что, если учесть это, я мог потреблять свой процессор в 4 раза больше, чем потребляю сейчас.

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

Трагическая история заключается в том, что это ситуация многих компаний-разработчиков программного обеспечения. Только представьте, из всех разработчиков (я имею в виду небрежных разработчиков, таких как я 😜) думают о потреблении всех этих ядер, сколько энергии они могли бы сэкономить для мира, просто не запуская несколько серверов для выполнения задачи, которую они могли бы иметь. было сделано с меньшим количеством серверов 😐. Per SE я сказал, что это не означает, что им не нужно эффективно использовать свои серверы. При написании кода, использующего все ядра, возникает много практических проблем. Трудно написать синхронизированный код, использующий все ядра. Прочитайте эту статью, чтобы лучше понять, почему писать параллельный код так сложно.

Здесь на сцену выходит Эликсир. Elixir — это отличный язык программирования, работающий на Erlang VM (BEAM), который помогает вам писать программное обеспечение с параллелизмом. Если вы ранее изучали параллельное программирование, вы, возможно, слышали о процессе, потоке, пуле потоков, блокировках, взаимном исключении, условиях гонки, взаимоблокировке и т. д. и эти слова как тишина перед бурей. Но поверь мне, Эликсир спасет тебя. Имейте в виду, что это не означает, что теперь разрабатывать параллельное программное обеспечение с помощью Elixir несложно.

Системы с высокой степенью параллелизма писать нелегко, но с Elixir язык на вашей стороне.

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

Актер обладает этими свойствами.

  • Почтовый ящик 📫
  • Идентификатор процесса 🆔

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

Выполнение

Создать новый процесс

Теперь давайте посмотрим, как написать параллельный код в Elixir с помощью этой модели акторов. Давайте создадим пример функции, чтобы изучить это.

Мы можем использовать функцию spawn/3 для асинхронного запуска этого процесса.

iex> pid = spawn(Example, :add, [3, 5])

Это вернет идентификатор процесса только что созданного процесса и запишет 8 в стандартный вывод. Этот вновь созданный процесс является Актером.

Передача сообщений

Вы уже знаете, что межпроцессное взаимодействие значительно усложняет параллелизм. Теперь давайте посмотрим, как мы можем передавать сообщения между процессами в Эликсире. В Эликсире для этого есть понятия: отправить/2 и получить. Мы можем отправлять сообщения процессам по их идентификатору процесса и получать, используя сопоставление с образцом для получения сообщений.

Теперь давайте создадим новый процесс из этой функции и отправим этому процессу несколько сообщений.

iex> pid = spawn(Example, :messageReceiver, [])
iex> send pid, {:ok, "hello"}
hello there
{:ok, "hello"} messageR
iex> send pid, {:ok, "who are you"}
I am a Elixir Process
{:ok, "who are you"}
iex> send pid, {:ok, "how are you"}
{:ok, "how are you"}

Функция messageReceiver перехватывает сообщения {:ok, "привет"} и {:ok, "кто ты" и выполняет связанные с ней процедуры. .Здесь для сообщения {:ok, «привет» он пишет «привет там» на стандартный вывод, а для {:ok, «кто ты»} сообщение пишет «Я процесс Elixir» на стандартный вывод. Функция messageReceiver не ищет сообщение типа {:ok, how are you”}, и ей просто все равно на это сообщение. Вы можете видеть, как функция messageReceiver работает рекурсивно, чтобы не останавливаться после перехвата первого сообщения.

Связывание процессов

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

iex> Example.run()
Process crashed: reason - crashed

Функция run создает новый процесс из функции iamgoingtocrash и связывает этот процесс с родительским процессом. При сбое дочернего процесса родительский процесс может уведомить его с помощью сообщения типа {:EXIT, _from_pid, Reason}.

Это основные принципы реализации параллелизма в Elixir. Если вам интересно узнать больше, прочитайте следующие статьи.

Теперь вы можете задаться вопросом, где происходят те, кто потребляет все ядра. BEAM отвечает за это. BEAM — это виртуальная машина Erlang, и наш код Elixir будет работать на этой виртуальной машине. Прочитайте эту статью, чтобы понять, как BEAM разработан для использования всех ядер вашего ПК.

Это все, что я собираюсь обсудить в этой статье. Поэтому, если вы хотите стать фанатом параллельных вычислений, вам лучше добавить Эликсир в свой набор инструментов.