Акторна модель оперує передачею повідомлень. Окремим процесам (акторам) дозволяється асинхронно надсилати повідомлення один одному. Що відрізняє це від того, що ми зазвичай вважаємо моделлю різьбових потоків, це те, що не існує (принаймні теоретично) спільного стану. І якщо хтось вважає (виправдано, я думаю), що спільна держава - корінь усього зла, тоді модель актора стає дуже привабливою.
Однак ми не повинні переживати хвилювання. Модель актора не робить (всупереч деяким твердженням) унеможливлення тупикових ситуацій. Модель актора також не заважає вам мати суперечки щодо ресурсів між різними процесами - наприклад, черги повідомлень. Модель лише "без замків" вище певного рівня. На нижчому рівні для координації черг повідомлень все ще потрібно блокування.
Чи не можна потік розглядати як актора та надсилати повідомлення іншим потокам?
Ну, так і ні. Ні, якщо ви просто використовуєте підхід розміщення мьютексів навколо спільної пам'яті. Потім потоки поділяють цей стан - вони обидва мають доступ до цієї пам’яті, можуть як читати, переписувати і т. Д. Але ви можете побудувати модель актора поверх моделі потоків, і справді у всіх реакторах актора є потоки внизу. Я зламав щось подібне (дуже погано), давши кожному потоку чергу, що охороняється мьютексом - просто для розваги. Щоб отримати уявлення про те, як управляється імпедансом актор-нитка, дивіться моє запитання від року тому .
Чи можу я використовувати модель актора будь-якою мовою, використовуючи теми по-різному?
Так, але для цього знадобиться трохи більше роботи. У вашій улюбленій мові цілком може бути бібліотека для передачі повідомлень, тому це було б першим, що слід дослідити. Крім того, слід дослідити використання незмінних структур даних. Зверніть увагу, що якщо структура даних незмінна, то ви, по суті, мали справу з проблемою "спільного стану" - кілька потоків можуть містити посилання на незмінні дані, не роблячи нічого поганого. Існує причина, чому акторські мови, як правило, також є функціональними мовами (ерланг, скала).
Можливо, ви також захочете поглянути на програмну транзакційну пам’ять, яка є іншою, але також вагомою моделлю. Clojure - мій улюблений приклад цього.