Три основных претендента на упрощение параллелизма - акторы, программная транзакционная память (STM) и автоматическое распараллеливание. Scala имеет реализации всех трех.
Актеры
Актеры находят свою наиболее заметную реализацию в языке Erlang, который, насколько я знаю, где и началась идея *. Эрланг разработан с нуля вокруг актеров. Идея состоит в том, что сами актеры являются черными ящиками друг для друга; они взаимодействуют только путем передачи сообщений.
Scala имеет реализацию акторов в своей библиотеке, а варианты доступны во внешних библиотеках. В основной библиотеке черный ящик не применяется, но существуют простые в использовании методы для передачи сообщений, а Scala позволяет легко создавать неизменяемые сообщения (поэтому вам не нужно беспокоиться о том, что вы отправляете сообщение с некоторым содержанием, а затем изменить содержимое в случайное время).
Преимущество актеров в том, что вам не нужно беспокоиться о сложном общем состоянии, что действительно упрощает рассуждения. Кроме того, вы можете разбить проблему на более мелкие части, чем потоки, и позволить библиотеке акторов выяснить, как объединить акторов в соответствующее количество потоков.
Недостатком является то, что если вы пытаетесь сделать что-то сложное, у вас есть много логики для отправки сообщений, обработки ошибок и т. Д., Прежде чем вы узнаете, что это удастся.
Программная транзакционная память
STM основан на идее, что наиболее важной параллельной операцией является получение некоторого общего состояния, манипулирование им и запись его обратно. Так что это дает возможность сделать это; однако, если он сталкивается с какой-то проблемой - которую он обычно задерживает на обнаружение до самого конца, в этот момент он проверяет, что все записи выполнены правильно - он откатывает изменения и возвращает ошибку (или пытается снова).
Это и высокопроизводительный (в ситуациях только с умеренной конкуренцией, поскольку обычно все идет просто отлично) и устойчивый к большинству видов ошибок блокировки , поскольку система STM может обнаруживать проблемы (и даже потенциально делать такие вещи, как убрать доступ из запроса с более низким приоритетом и передать его более высокому приоритету).
В отличие от актеров, проще пробовать сложные вещи, если вы можете справиться с неудачей. Тем не менее, вы также должны правильно рассуждать о базовом состоянии; STM предотвращает редкие непреднамеренные взаимоблокировки с помощью сбоя и повторных попыток, но если вы просто допустили логическую ошибку, и определенный набор шагов не может быть выполнен, STM не сможет этого допустить.
Scala имеет библиотеку STM, которая не является частью стандартной библиотеки, но рассматривается для включения. Clojure и Haskell имеют хорошо разработанные библиотеки STM.
Автоматическое распараллеливание
Автоматическое распараллеливание предполагает, что вы не хотите думать о параллелизме; Вы просто хотите, чтобы все произошло быстро. Поэтому, если у вас есть какая-то параллельная операция - например, применение какой-либо сложной операции к коллекции элементов, по одному, и создание некоторой другой коллекции в результате - у вас должны быть подпрограммы, которые автоматически делают это параллельно. Коллекции Scala можно использовать таким образом (существует метод .par
, который преобразует обычную последовательную коллекцию в ее параллельный аналог). Многие другие языки имеют аналогичные функции (Clojure, Matlab и т. Д.).
Редактировать: На самом деле, модель Actor была описана еще в 1973 году и, вероятно, была мотивирована более ранней работой в Simula 67 (с использованием сопрограмм вместо параллелизма); в 1978 году появились связанные последовательные процессы . Таким образом, возможности Эрланга не были уникальными в то время, но язык был уникально эффективен при развертывании модели актера.