Одной из трудностей обработки нескольких запросов на нескольких ядрах является тот факт, что теперь у вас есть несколько частей вашей программы, работающих одновременно и изменяющих состояние.Итак, мьютексы приходят, и теперь вам нужно беспокоиться о том, является ли функция поточно-ориентированной, и управлять блокировкой / ожиданием / возобновлением блокировок и мьютексов.Это означает, что теперь у вас есть куча потенциальных узких мест, и это может увеличить расходы и уменьшить (или даже устранить) то, что вы ожидали от параллелизма.
Эрланг и Эликсир имеют параллелизм, основанный на «Модель актера» .Актер получает сообщения и из этих сообщений может создавать новые сообщения, определять, как обрабатывать следующее сообщение, изменять свое собственное внутреннее состояние или создавать больше актеров.То, что сводится к тому, что каждый актер имеет свое собственное состояние, так что вам больше не нужно беспокоиться о блокировках или мьютексах.Это помогает облегчить умственную нагрузку при написании параллельного кода и, как абстракция, упрощает анализ параллелизма.В результате получается более эффективный параллельный код, который легче поддерживать.Модель актера может быть реализована на любом языке, но она встроена в Elixir и Erlang.
Кроме того, Elixir и Erlang являются функциональными языками.В функциональных языках побочные эффекты, задерживающиеся в состоянии от предыдущих вызовов методов, как правило, можно избежать.Это означает, что до тех пор, пока вы не нарушите функциональную чистоту, у вас есть возможность сказать, что метод будет возвращать одно и то же каждый раз.Что означает f (x) + f (x) == f (x) * 2.Это означает, что вы можете распараллеливать вещи в большей степени без страха.Запуск f (x) в одном потоке и g (x) в другом не может привести к состоянию гонки, если они функционально чисты.Потому что ни один из них не влияет на состояние.