Недавно начал читать Эликсир в действии. Хотя я бы не рекомендовал эту книгу новичкам в Elixir, я определенно считаю, что это отличный ресурс для тех, кто хочет узнать, что делает Elixir/Erlang особенным и какие программные конструкции используются для достижения параллельности. ,отказоустойчивость,имасштабируемость.

Саша Юрич проделал невероятную работу, рассказав, как Elixir/Erlang достигают этих целей, и все начинается с идеи процессов. Ниже приведены мои общие выводы из главы 5 Эликсира в действии — Примитивы параллелизма:

Процессы

  • Процессы — это основные строительные блоки возможностей параллелизма и параллелизма в Elixir/Erlang.
  • Параллелизм означает, что каждый процесс работает в своей собственной среде выполнения, не разделяя память с каким-либо другим процессом.
  • Параллелизм означает, что несколько процессов могут выполняться одновременно.
  • Функция spawn/1 используется для создания новых процессов. Функция spawn/1 принимает в качестве аргумента функцию с нулевой арностью. В результате мы должны использовать механизм замыкания для «передачи» данных в новый порождаемый процесс:
def async(data) do
  spawn fn ->
    # Execute Something
    # data variable is available here thanks to closure
  end
end
  • Поскольку процессы являются параллельными, т. е. не используют общую память, данные, предоставляемые процессом A процессу B, являются глубокой копией данных. В приведенном выше примере переменная data копируется в контекст выполнения порожденного процесса.
  • Процессы взаимодействуют друг с другом посредством передачи сообщений. Сообщения можно отправлять другому процессу с помощью функции send/2.
  • Сообщения, отправленные процессу, будут храниться в его почтовом ящике до тех пор, пока не произойдут два события. Во-первых, процесс должен проверить свой почтовый ящик с помощью макроса receive. Во-вторых, сообщение в почтовом ящике должно соответствовать шаблону.
  • Хотя несколько процессов могут выполняться параллельно, каждый процесс сам по себе является последовательным. Он либо обрабатывает сообщение, либо проверяет свой почтовый ящик на наличие сообщения.