Як працюють актори порівняно з темами?


88

Чи є хороше і коротке пояснення того , як актори порівняно з нитками?

Чи не можна потік розглядати як актора та надсилати повідомлення іншим потокам? Я бачу якусь різницю, але для мене це не так зрозуміло. Чи можу я використовувати Актори в будь-якій мові, використовуючи теми по-різному?

Відповіді:


78

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

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

Чи не можна потік розглядати як актора та надсилати повідомлення іншим потокам?

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

Чи можу я використовувати модель актора будь-якою мовою, використовуючи теми по-різному?

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

Можливо, ви також захочете поглянути на програмну транзакційну пам’ять, яка є іншою, але також вагомою моделлю. Clojure - мій улюблений приклад цього.


3
Чим більше я використовую асинхронні моделі передачі повідомлень на основі моделей паралельності (наприклад, актори або async / await), тим більше я думаю, що вони просто подвійні від старої, стандартної синхронізованої моделі паралельності блокування. Асинхронне передавання повідомлень насправді не є ні простішим, ні складнішим, ніж використання замків та моніторів. Дійсно, спільного мінливого стану не існує, але лише на рівні окремого актора . Але у актора все ще є мінливий стан, і він фактично спостерігається всіма акторами, які співпрацюють з ним. Отже, у вас можуть бути однакові проблеми: тупикові ситуації, заморозки, голод, умови перегонів тощо
Piotr Kołaczkowski

2

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

JActor (бібліотека Java) також не використовує блокування. Лише деякі атомні та одночасні структури даних із введеними кількома семафорами. Передача повідомлень становить близько .8 мільярдів повідомлень в секунду.

https://github.com/laforge49/JActor


2
Модель актора визначається лише за допомогою асинхронного спілкування ( en.wikipedia.org/wiki/Actor_model ). Якщо JActor цього не робить, то це не на 100% лише модель актора. Він може просто використовувати модель актора як одну з багатьох своїх особливостей.
BT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.