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

Вот список некоторых языков программирования, которые представляют соответствующую модель параллелизма:

  • Модель актеров - Erlang, Scala, Rust
  • CSP - Go-lang
  • Потоки - Java, C #, C ++

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

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

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

Но нас интересуют наиболее эффективные методы, позволяющие заставить наши приложения работать параллельно и на всем пути асинхронно.

Итак, в этой статье я бы предпочел сравнить модель акторов с CSP:

Во-первых, обе модели основаны на передаче сообщений: отправитель отправляет сообщение, а получатель его получает. В обеих моделях получатель является синхронным: когда он готов прослушивать сообщения, он блокируется до тех пор, пока не получит сообщение (хотя варианты позволяют им выполнять неблокирующий опрос или иметь тайм-аут).

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

С актерами отправка асинхронная. Отправитель сообщения не будет блокировать, готов ли читатель к извлечению из почтового ящика, вместо этого сообщение помещается в очередь, обычно называемую «почтовым ящиком». Это удобно, но об этом немного труднее рассуждать, и в почтовых ящиках может храниться много сообщений.

В CSP процессы общаются с помощью каналов. Программа может создавать и передавать их как объекты первого класса. У актеров есть адресная система и почтовые ящики. Только один адрес на процесс.

В CSP операция отправки и получения может блокироваться. В модели акторов может блокироваться только операция получения.

В CSP сообщения доставляются в том порядке, в котором они были отправлены, в модели акторов это не так. На самом деле система может вообще не доставлять некоторые сообщения.

Пока модель CSP лучше всего работает на одной машине, в то время как модель Актеров легко масштабируется на нескольких машинах.

В заключение: Актеры больше подходят для распределенных систем. Из-за блокирующего характера CSP их сложно использовать на нескольких машинах / средах выполнения.