Чи правильний мій опис акторської моделі?


13

Як я зрозумів, акторська модель подібна до об'єктної моделі, але з кількома відмінностями:

  1. КОЖЕН об’єкт породжує власну окрему нитку, і це не проблема, навіть якщо у вас є тисячі об'єктів.
  2. Актори не взаємодіють за допомогою виклику функцій та отримання зворотних значень, а натомість, надсилаючи та отримуючи повідомлення.
  3. Якщо ви не порушите цю модель, ваш додаток буде використовувати сукупність на повну потужність без жодних ризиків для перегонів.
  4. Все, що ви можете зробити в ОО, ви можете зробити, використовуючи акторів, але краще, проблема полягає в тому, що все, що ми кодували в останні роки, базувалося на ОО - але перехід неминучий.

Наприклад, припустимо, що я повинен визначити 3d векторний клас / актор, створити два екземпляри та викликати операцію з сумою на них.

ОБ'ЄКТ ОРІЄНТОВАНО:

class V3d {
   constructor V3d(x,y,z) //bla
   float x,y,z;
   function sum(V3d b) 
   { 
      return V3d(x+b.x,y+b.y,z+b.z); 
   }
}

//using:
mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly
drawPoint(mySum) //uses the result

МОДЕЛЬ АКТОРА:

actor V3d 
{
    constructor V3d(x,y,z) //bla
    float x,y,z;
    loop 
    {
       receive 'sum',b:V3d :
           send(caller,'sumResult',V3d(x+b.x,y+b.y,z+b.z))
    }
 }

//using:
send(V3d(1,2,3),'sum',V3d(3,2,1)) //creates 2 instances, send to the first one a request to sum with the second one

loop 
{
   receive 'sumResult',result:
      drawPoint(result) //receives result and draws it
}

Є те, що його? Або я абсолютно помиляюся?


Легкі актори, мікроагенти або компоненти потоку даних не обов'язково використовують власну нитку. :-) Перевірте такі терміни: програмування на основі актора, програмування на основі агентів, програмування на основі даних. Вони дуже схожі, але мають різні обмеження. Ох, я буду це задавати як питання ;-)
inf3rno

Відповіді:


12

Коротка відповідь - ні, це невірно.

  1. починається досить правильно (кожен Актор принаймні потенційно виконується як незалежна нитка), але потім значною мірою відходить від рейок. Немає нічого про модель, яка змушує багато потоків працювати добре - це залежить від реалізації. Щонайбільше, простота створення безлічі ниток тисне на реалізацію, щоб забезпечити ефективну нитку. Принаймні, що стосується моделі, будь-яка схожість між акторами та предметами здебільшого збігається. "Об'єкт" має досить конкретні наслідки щодо того, як ви поєднуєте код і дані. Актор, як правило, включає в себе і код, і дані, але мало натякує на те, як вони поєднуються (крім того, що єдині дані, видимі для зовнішнього світу, - повідомлення).

  2. Звичайний спосіб опису взаємодії - це передача повідомлень, так. У мене немає зручності цитування, але хтось доволі давно довів, що такі механізми, як віртуальні функції C ++, є ізоморфними для надсилання повідомлень (оскільки віртуальні функції зазвичай реалізуються, ви використовуєте зміщення в vtable - але якщо ви надіслав замість цього в таблицю повідомлень, ефект був би однаковий).

  3. Це не так просто. Якщо ви можете знайти копію, Генрі Бейкер (з кимось іншим, чиє ім’я я зараз не пам’ятаю) написав документ про правила, необхідні для узгодження даних у моделі Актора.

  4. "Краще" є в кращому випадку суб'єктивним. Деякі проблеми мають дуже паралельний характер, і вони дійсно пов'язані з великою кількістю по суті автономних утворень, при мінімальній взаємодії, в першу чергу, асинхронній. Коли це так, акторська модель справді може працювати дуже добре. Для інших проблем це справді не так. Деякі проблеми майже повністю носять серійний характер. Інші можуть виконуватися паралельно, але все ж вимагають тісної синхронізації між цими діями (наприклад, по суті, як SIMD-режим, коли ви виконуєте одну інструкцію за один раз, але кожна інструкція діє на велику кількість елементів даних). Звичайно, можна вирішити обидва ці проблеми за допомогою акторської моделі, але для таких проблем це часто передбачає неабияку додаткову роботу за невеликий або взагалі ніякий прибуток.


Немає зв'язку між кількістю акторів та кількістю потоків; що гарантує модель актора - це те, що даним екземпляром одночасно керуватиметься лише одним потоком, тому ваші актори вже захищені від потоку і вам не потрібно використовувати стратегії синхронізації та блокування всередині них.
Роб Кроуфорд

@RobCrawford: це один (досить тривіальний) спосіб забезпечення узгодженості даних у моделі Актора. Папір Hewitt / Baker охоплює більше можливостей, таких як кілька копій актора, що працює в окремих нитках (хм ... дивлячись на мою відповідь, мені цікаво, чи я, чесно, не міг згадати ім'я Карла Хьюітта в той час, або був бути іронічним, коли я це написав).
Джеррі Труну

Чи не асинхронність передачі повідомлення є важливим елементом моделі? Це, безумовно, заважало би бути ізоморфним з викликами віртуальних функцій, які є синхронними за своєю суттю. Або відмінність не має значення з певної точки зору?
хлопчик

2

Щодо 1: Я працював з одним (ish) потоковою програмою Actor-modelled, тому цілком можливо знехтувати великим числом потоків, що це говорить. AFAIK, нитки не є легкими предметами будь-якими способами, тому, мабуть, не бажано мати їх для кожного актора, залежно від того, скільки акторів ви використовуєте.

Щодо 3: Я цілком впевнений, що умови гонки можуть траплятися в акторських системах просто завдяки логіці програмування?

Відносно 4: Визначте «краще»? Мій досвід показав, що асинхронну логіку читати набагато складніше, ніж синхронні речі. наприклад, у вашому прикладі вище ви не знаєте, яка операція відповідає за результат, тому слід додатково відстежувати повідомлення. Після того, як це додається і інші повідомлення входять і виходять включені в логіку, намір коду поширюється на кілька функцій надсилання / отримання.

Сказавши все це, я великий фанат використання акторської моделі для верхніх шарів програми. Це може полегшити розв’язку, оскільки додавання залежностей трохи складніше, ніж додавання функції. Я також не маю великого досвіду роботи з більш високим рівнем, ніж мови Java, і інші парадигми можуть підтримувати асинхронність більш фундаментальним чином.


Щодо №1: Ну, "нитка" може стосуватися багатьох речей. Насправді, потоки ОС зазвичай досить важкі, правда, але існують мовні умови виконання, які внутрішньо обробляють сотні, тисячі, навіть мільйони "потоків" виконання в межах невеликої кількості потоків ОС. У деяких реалізаціях такі моделі, мабуть, налічують до десятків ядер (я бачив заяви, що останні версії GHC чудово грають з 32 ядрами).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.