Erlang и Go параллельное программирование, объективные различия между CSP и Actors?

19

Я изучал параллельное программирование на языках программирования Erlang и Go. Согласно моему выводу, они используют модель актера и CSP соответственно.

Но все же меня смущает, каковы объективные различия между CSP и актерами? это только теоретически другое, но одно и то же понятие?

nish1013
источник
Ну, они не одинаковы, так как Go предоставляет другой набор примитивов, чем Erlang. Кроме того, Go намного ниже уровня, чем Erlang и C-like.
Даниэль Гратцер
Вопросы о том, каким языком, технологией или проектом следует заняться следующим, не являются темой для программистов, поскольку они могут привлекать только субъективные мнения для ответов. За этим вопросом стоит слишком много индивидуальных факторов, чтобы создать ответы, которые будут иметь длительную ценность. Рекомендуемое чтение: Горилла против Акулы
комнат
3
@gnat Я не согласен, это спрашивает об объективных различиях между CSP и Актерами. Это вполне разумный вопрос
Даниэль Гратцер
2
Вопрос не о хорошем или плохом, а о другом, который необходимо определить, поэтому этот вопрос является конкретным и не является причиной для субъективных дебатов.
nish1013
1
Есть очень хороший ответ на этот вопрос о теории CS StackExchange: в чем разница между актерской моделью параллелизма и последовательным сообщением процессов
Йорг Миттаг

Ответы:

21

На практике разница очень мала: оба представляют отдельные единицы исполнения, чей основной интерфейс с внешним миром - через сообщения.

Различия в деталях реализации языков. Вот несколько таких деталей:

  • Каналы в Go набраны; если вы хотите отправлять сообщения с разными данными, вам нужны отдельные каналы. С помощью Erlang можно receiveполучить все, что отправлено процессу, и выполнить сопоставление с шаблоном (в Go вы должны использовать selectнесколько случаев, поэтому код будет выглядеть очень похожим, только с разными каналами).
  • Любой может читать или писать канал Go. В Erlang любой может отправить процесс, но только этот процесс получит. Это становится важным, если вы хотите разделить задачу между несколькими работниками: в Erlang вам нужно создать процесс распространения, в то время как Go может просто поделиться каналом.
  • Erlang обеспечивает (в основном) прозрачный путь к распределению процессов на нескольких хостах / виртуальных машинах. Горутины ограничены одним процессом (хотя есть библиотеки для распространения).
  • Обработка ошибок очень отличается. Erlang рассматривает каждый процесс как независимый: ошибка в одном процессе (скажем, деление на 0) не повлияет на другие процессы, если вы явно не связываете их (хотя что-то, ожидающее сообщения от мертвого процесса, зависнет). Goroutines все работают в одном пространстве процесса; деление на 0 уничтожит всю программу.
  • В Эрланге данные неизменны. Это означает, что вся коммуникация между процессом и внешним миром происходит через сообщения. Go позволяет вам делиться состоянием между программами (хотя вы не должны).

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

kdgregory
источник