Модель акторів
Модель акторів (англ. actor model) — математична модель конкурентних обчислень, у якій програма складається з незалежних обчислювальних сутностей — акторів (англ. actors). Кожен актор може отримувати повідомлення, виконувати обчислення, зберігати власні дані та надсилати повідомлення іншим акторам. Актори взаємодіють через асинхронний обмін повідомленнями, не змінюючи безпосередньо внутрішній стан один одного. У програмуванні це один зі способів організувати одночасну роботу багатьох частин програми без прямого спільного доступу до змінюваних даних.[1][2]
Модель запропонували Карл Г'юїтт (Carl Hewitt), Пітер Бішоп (Peter Bishop) і Річард Стайґер (Richard Steiger) 1973 року під час досліджень штучного інтелекту в Массачусетському технологічному інституті. Згодом вона стала одним із підходів до створення паралельних і розподілених систем. Її принципи застосовано, зокрема, в Erlang, Elixir та програмних платформах Akka й Microsoft Orleans.[3][4]
Найпростіше уявити актора як невеликого самостійного виконавця, який поєднує три можливості:
- зберігати інформацію
- обробляти отримані повідомлення
- надсилати нові повідомлення
Наприклад, один актор може зберігати залишок товару на складі, інший — опрацьовувати замовлення, а третій — повідомляти покупця про результат. Коли актор замовлень отримує запит, він може звернутися до актора складу й продовжити роботу після отримання відповіді. При цьому кожен актор сам керує своїми даними; інші актори не змінюють їх безпосередньо.[1][5]
Аналогією є мережа комп'ютерів. Кожен комп'ютер має власну пам'ять і процесор, отримує запити через мережу, виконує обчислення, зберігає дані й надсилає відповіді. Подібно до цього, актор має свою адресу, внутрішній стан і реагує на повідомлення інших акторів. Однак актор — це логічна одиниця програми, а не обов'язково окремий комп'ютер: на одному комп'ютері можуть одночасно працювати тисячі акторів, а актори однієї системи можуть розміщуватися на різних комп'ютерах. Дослідники Гул Ага й Ву Йон Кім розглядали модель акторів як спільний підхід до паралельних обчислень на одному комп'ютері та розподілених обчислень у мережі.[6][4]
Для розуміння ідеї корисна й аналогія зі спілкуванням людей: людина має власні знання, одержує прохання чи повідомлення, обмірковує їх і може відповісти або звернутися до когось іншого. Це лише пояснювальне порівняння, а не твердження, що людське спілкування буквально підпорядковується математичній моделі акторів. Така метафора має історичне підґрунтя: у першій праці про модель 1973 року її автори пояснювали назву «актор» через виконавця ролі, який реагує на сигнал, і порівнювали взаємодію акторів зі спільнотою учасників, що звертаються один до одного з проханнями.[3]
Кожен актор має власну ідентичність (адресу), внутрішній стан і спосіб реагування на повідомлення. Коли він отримує повідомлення, то може виконати обчислення, змінити свій стан і надіслати повідомлення іншим акторам. Щоб одержати інформацію від іншого актора або попросити його виконати дію, потрібно надіслати повідомлення на його адресу. Надсилання є асинхронним: відправникові не потрібно чекати, доки адресат завершить обробку повідомлення. Якщо потрібна відповідь, вона надходить окремим повідомленням.[5][4]
У класичному формулюванні моделі, яке систематизував дослідник конкурентних обчислень Гул Ага (Gul Agha), поведінку актора визначають три основні дії:[1][4]
- Надсилання повідомлення (англ. send) — передавання даних іншому акторові за відомою адресою.
- Створення актора (англ. create) — поява нового актора, який може незалежно отримувати й надсилати повідомлення.
- Зміна поведінки (англ. become) — визначення способу обробки наступних повідомлень, зокрема зі зміненим внутрішнім станом.
Наприклад, у програмі може існувати актор-лічильник, який зберігає число. Повідомлення «збільшити» змінює збережене значення, а повідомлення «дізнатися значення» спонукає лічильник надіслати відповідь акторові, який її запросив. Інші частини програми не змінюють число безпосередньо. Якщо відповідь потрібна, адреса отримувача відповіді може бути передана разом із запитом. Такий обмін дає змогу будувати взаємодію, подібну до виклику функції, за допомогою повідомлень.[5]
У багатьох практичних реалізаціях кожен актор має власну чергу повідомлень (англ. mailbox) і обробляє їх по одному. Під час обробки одного повідомлення його стан захищено від одночасної зміни іншими акторами. Водночас інші актори можуть виконуватися незалежно. Однак окремий потік операційної системи для кожного актора не потрібен: середовище виконання може обслуговувати велику кількість акторів меншою кількістю потоків. Черга повідомлень і спосіб планування виконання належать до особливостей реалізації, а не є обов'язковими фізичними складниками самої математичної моделі.[4][7]
Порядок надходження повідомлень, особливо від різних відправників, може впливати на результат. Тому конкретні гарантії порядку обробки, доставки й зберігання повідомлень визначаються обраною мовою або акторною платформою. Асинхронне надсилання саме по собі не означає гарантованої доставки повідомлення в разі збою.[4][7]
У традиційному багатопотоковому програмуванні кілька потоків можуть працювати зі спільними змінюваними даними в пам'яті. Наприклад, якщо два потоки одночасно збільшують той самий лічильник, один із результатів може загубитися. Щоб запобігти таким станам гонитви, застосовують блокування, м'ютекси, атомарні операції та інші засоби синхронізації.[2]
Модель акторів пропонує інший спосіб організувати доступ до стану. Якщо значенням лічильника володіє окремий актор, решта частин програми не збільшують його напряму. Натомість кожна надсилає лічильникові повідомлення «збільшити на одиницю», а сам актор послідовно оновлює власне число. Таким чином, узгодження змін переноситься з прямого доступу до спільної змінної на обмін повідомленнями та правила їх обробки. Це спрощує захист внутрішнього стану окремого актора, хоча правильність усієї програми все одно залежить від порядку повідомлень і логіки взаємодії між акторами.[5][2]
Ідеться не про відмову від оперативної пам'яті як такої. Багато акторів можуть виконуватися на одному багатоядерному комп'ютері й фізично використовувати ту саму оперативну пам'ять. Відмінність полягає в тому, що програмна модель не передбачає безпосереднього довільного доступу одного актора до змінюваного стану іншого. Водночас окремі різновиди акторних систем підтримують безпечне передавання або контрольоване спільне використання даних для підвищення ефективності.[2][4]
Модель акторів виникла на початку 1970-х років у дослідженнях штучного інтелекту. Карл Г'юїтт разом із Пітером Бішопом і Річардом Стайґером у статті A Universal Modular ACTOR Formalism for Artificial Intelligence (1973) запропонували розглядати функції, структури даних і обчислювальні процеси через спільне поняття актора, який реагує на повідомлення. Дослідники прагнули описувати складні обчислення без потреби задавати всю взаємодію як послідовність команд одного центрального виконавця.[3]
Однією з ранніх реалізацій стала мова PLASMA, створена в середині 1970-х років. Згодом з'явилися дослідницькі акторні мови, зокрема Act 1 Генрі Лібермана (Henry Lieberman), Rosette та сімейство ABCL (англ. Actor-Based Concurrent Language), яке розробляли під керівництвом Акінорі Йонедзави (Akinori Yonezawa). Ці проєкти досліджували різні способи поєднання об'єктів, паралельного виконання й обміну повідомленнями.[5][4]
Важливим етапом стало дослідження Гула Аги, опубліковане 1986 року як монографія Actors: A Model of Concurrent Computation in Distributed Systems. У ньому акторну модель описано через створення акторів, надсилання повідомлень і зміну поведінки, а також розроблено формальні засоби аналізу конкурентних обчислень. Надалі теоретичні основи моделі розвивали дослідники семантики програмування, зокрема Ага, Ієн Мейсон, Скотт Сміт і Керолін Толкотт.[1][5]
Вихід моделі за межі дослідницьких систем пов'язаний передусім із мовою Erlang, створеною для телекомунікаційних систем компанії Ericsson. Її легкі ізольовані процеси та обмін повідомленнями стали одним із найвідоміших промислових втілень акторного підходу. Згодом з'явилися інші мови й бібліотеки, які використовують різні різновиди цієї моделі.[4][8]
Модель акторів не є окремою мовою програмування. Одні мови включають її принципи безпосередньо до механізмів конкурентного програмування, інші надають їх через бібліотеки й програмні платформи. Способи організації акторів, їхнього стану й обміну повідомленнями в таких системах відрізняються.[4]
У Erlang роль акторів виконують легкі процеси, кожен із власним станом і чергою повідомлень. Нові процеси запускаються за допомогою spawn, повідомлення надсилають оператором !, а одержують конструкцією receive. Процеси Erlang не мають спільної змінюваної пам'яті у звичайному механізмі обміну повідомленнями; за потреби взаємодія може відбуватися і між процесами на різних вузлах мережі.[8]
Elixir працює на віртуальній машині BEAM і використовує той самий механізм легких процесів. Зокрема, вона надає функції spawn, send і конструкцію receive. Платформа Erlang/OTP, доступна також програмам Elixir, містить засоби організації процесів і нагляду за ними для відновлення роботи після збоїв. Нагляд за процесами є властивістю відповідної програмної платформи, а не автоматичною гарантією математичної моделі акторів.[9][8]
- Scala та Akka. У Scala існувала окрема бібліотека Scala Actors; ширше застосування отримала платформа Akka, що надає акторну модель для Scala й Java. Актори Akka обробляють повідомлення, можуть змінювати поведінку та утворюють ієрархію нагляду для обробки збоїв.[10][4]
- Microsoft Orleans. Платформа для .NET використовує різновид моделі — віртуальних акторів (англ. virtual actors). Їх називають grains; вони мають сталі ідентифікатори, а середовище виконання автоматично активує потрібні екземпляри й може вивантажувати неактивні. Цей підхід призначено для розроблення розподілених застосунків.[11]
- Pony. Мова програмування, у якій актори є одним з основних засобів конкурентності, а система типів керує безпечним доступом до даних, що передаються між ними.[12]
- E та AmbientTalk. Мови, що використовують асинхронне надсилання повідомлень між ізольованими середовищами виконання. Дослідники відносять їх до родини акторних систем зі спільним циклом обробки подій (англ. communicating event-loop actors).[4]
- SALSA та ABCL/1. Дослідницькі мови, що розвивали акторний підхід і концепцію активних об'єктів; у SALSA, зокрема, використовувалися асинхронні виклики та повідомлення.[4]
З моделлю акторів історично пов'язана також Smalltalk. Проте надсилання повідомлень між об'єктами Smalltalk саме по собі не означає їхнього паралельного виконання: у класичній Smalltalk-80 звичайне повідомлення є синхронним викликом методу. Для реалізації акторних систем на її основі створювали окремі розширення, зокрема Actalk. Тому Smalltalk некоректно називати мовою, в якій кожен об'єкт автоматично є незалежним актором.[13]
Основна перевага акторного підходу — інкапсуляція стану та взаємодія через явні повідомлення. Ізоляція акторів допомагає уникати низькорівневих станів гонитви під час доступу до спільних змінюваних даних. Оскільки окремі актори можна виконувати незалежно, модель придатна для систем із великою кількістю одночасних завдань, а також для розподілених систем, у яких обмін повідомленнями природно відповідає мережевій взаємодії.[4][5]
Водночас акторна модель не усуває всіх складнощів конкурентного програмування. Повідомлення можуть надходити в несподіваному порядку; кілька пов'язаних повідомлень не утворюють автоматично одну неподільну операцію. Можливі логічні помилки через невдалу послідовність дій, взаємне очікування відповідей чи порушення протоколу обміну повідомленнями. У практичних реалізаціях необхідно також враховувати витрати на передавання даних, збільшення черг і дії у випадку збоїв.[4][14]
Тому модель акторів є способом організації конкурентних обчислень, а не універсальним засобом автоматичного забезпечення відмовостійкості або правильності програми. Для складних систем її часто доповнюють механізмами нагляду за процесами, обмеження черг, повторного надсилання повідомлень і збереження стану, які визначаються конкретною платформою.[10][11][14]
- 1 2 3 4 Agha, Gul A. (1986). Actors: A Model of Concurrent Computation in Distributed Systems. MIT Press. ISBN 978-0-262-01092-4.
- 1 2 3 4 De Koster J., Marr S., D'Hondt T., Van Cutsem T. Domains: Safe Sharing among Actors // Science of Computer Programming. 2014. Vol. 98, no. 2. P. 140–158.
- 1 2 3 Hewitt C., Bishop P., Steiger R. A Universal Modular ACTOR Formalism for Artificial Intelligence // Proceedings of the Third International Joint Conference on Artificial Intelligence. 1973. P. 235–245.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 De Koster J., Van Cutsem T., De Meuter W. 43 Years of Actors: A Taxonomy of Actor Models and Their Key Properties // Proceedings of the 6th International Workshop on Programming Based on Actors, Agents, and Decentralized Control. 2016. P. 31–40. DOI: 10.1145/3001886.3001890.
- 1 2 3 4 5 6 7 Agha G. A., Mason I. A., Smith S. F., Talcott C. L. A Foundation for Actor Computation // Journal of Functional Programming. 1997. Vol. 7, no. 1. P. 1–72.
- ↑ Agha G. A., Kim W. Actors: A Unifying Model for Parallel and Distributed Computing // Journal of Systems Architecture. 1999. Vol. 45, no. 15. P. 1263–1277. DOI: 10.1016/S1383-7621(98)00067-8.
- 1 2 Hewitt C. Actor Model of Computation: Scalable Robust Information Systems. 2010. Розділи «Fundamental concepts» і «Direct communication and asynchrony».
- 1 2 3 Concurrent Programming // Erlang System Documentation. Офіційна документація Erlang/OTP. Процитовано 21 жовтня 2026.
- ↑ Processes // Elixir Documentation. Офіційна документація Elixir. Процитовано 21 жовтня 2026.
- 1 2 Introduction to Actors // Akka Documentation. Офіційна документація Akka. Процитовано 21 жовтня 2026.
- 1 2 Orleans overview // Microsoft Learn. 22 січня 2026. Процитовано 21 жовтня 2026.
- ↑ Pony Tutorial. Офіційна документація Pony. Процитовано 21 жовтня 2026.
- ↑ Briot J.-P., Guerraoui R. On the Use of Smalltalk for Concurrent and Distributed Programming // SI Informatik Journal. Special Issue on Smalltalk. 1996. Vol. 1. Розділи 3–4.
- 1 2 Torres Lopez C., Marr S., Mössenböck H., Gonzalez Boix E. A Study of Concurrency Bugs and Advanced Development Support for Actor-based Programs. 2017. arXiv:1706.07372.
- Agha G. A. Actors: A Model of Concurrent Computation in Distributed Systems. MIT Press, 1986. ISBN 978-0-262-01092-4.
- Agha G. A., Mason I. A., Smith S. F., Talcott C. L. A Foundation for Actor Computation // Journal of Functional Programming. 1997. Vol. 7, no. 1. P. 1–72.
- Agha G. A., Kim W. Actors: A Unifying Model for Parallel and Distributed Computing // Journal of Systems Architecture. 1999. Vol. 45, no. 15. P. 1263–1277.
- De Koster J., Van Cutsem T., De Meuter W. 43 Years of Actors: A Taxonomy of Actor Models and Their Key Properties // Proceedings of the 6th International Workshop on Programming Based on Actors, Agents, and Decentralized Control. 2016. P. 31–40.