How does Actors work compared to threads?

Is there any good and short explanation of how Actors works compared to threads?

Can't a thread be seen as an actor and send messages to other threads? I see some difference, but it's not that clear for me. Can I use Actors in any language by using threads differently?

85
задан Jonas 16 November 2011 в 13:25
поделиться

1 ответ

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

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

Разве поток не может рассматриваться как действующее лицо и отправлять сообщения другим потокам?

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

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

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

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

74
ответ дан 24 November 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: