Как действует актер по сравнению с потоками? - PullRequest
85 голосов
/ 27 августа 2010

Есть ли хорошее и краткое объяснение того, как Актеры работают по сравнению с потоками?

Не может ли поток рассматриваться как актер и отправлять сообщения другим потокам?Я вижу некоторую разницу, но это не так ясно для меня.Могу ли я использовать Актеры на любом языке, используя потоки по-другому?

Ответы [ 2 ]

74 голосов
/ 27 августа 2010

Модель актера работает с передачей сообщений.Отдельные процессы (акторы) могут отправлять сообщения асинхронно друг другу.Что отличает это от того, что мы обычно называем моделью потоков, так это то, что (по крайней мере, в теории) не существует общего состояния.И если кто-то верит (вполне оправданно, я думаю), что общее состояние является корнем всего зла, тогда модель актера становится очень привлекательной.

Однако мы не должны волноваться.Модель актера не делает (вопреки некоторым утверждениям) невозможность иметь тупики.Актерская модель также не предотвращает конфликт между ресурсами за разные процессы - например, очереди сообщений.Модель только «без блокировки» выше определенного уровня.На более низком уровне для координации очередей сообщений все еще требуется блокировка.

Может ли поток рассматриваться как субъект и отправлять сообщения другим потокам?

Ну да и нет.Нет, если вы просто используете подход размещения мьютексов вокруг общих областей памяти.Затем потоки разделяют это состояние - у них обоих есть доступ к этой памяти, они могут как читать, переписывать и т. Д. Но вы можете построить модель актора поверх модели потоков, и на самом деле все реализации акторов имеют потоки.под.Я взломал что-то вроде этого (очень плохо), дав каждому потоку очередь, защищенную мьютексом - просто для удовольствия.Чтобы получить представление о том, как управляется импеданс нити актера, см. мой вопрос год назад .

Могу ли я использовать модель актора на любом языке, используя потоки по-другому?

Да, но это займет немного больше работы.Ваш любимый язык может иметь библиотеку передачи сообщений, так что это будет первое, что нужно исследовать.Кроме того, вы должны исследовать использование неизменяемых структур данных.Обратите внимание, что если структура данных является неизменяемой, то вы, по сути, имеете дело с проблемой «общего состояния» - несколько потоков могут хранить ссылки на неизменяемые данные без каких-либо проблем.Есть причина, по которой языки актеров, как правило, также являются функциональными языками (erlang, scala).

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

2 голосов
/ 05 января 2012

Я бы не сказал, что актеры всегда передают сообщения асинхронно - это будет слишком медленно.Например, проект JActor использует двусторонние сообщения (запрос / ответ), чтобы лучше смоделировать вызов метода.И большинство запросов обслуживается синхронно.

JActor (библиотека Java) также не использует блокировки.Только некоторые атомарные и параллельные структуры данных с несколькими семафорами. Передача сообщений - около 0,8 миллиардов сообщений в секунду.

...