Якась хороша реалізація Actors для C #? [зачинено]


75

Чи є якась реалізація моделі паралельності акторів для .net / c #?

Мені доводиться оптимізувати рутину ac #, і я думаю, що модель акторів ідеально підходить як рішення моєї проблеми. На жаль, я маю досвід лише з впровадженням Scala.


Відповіді:


22

Ви повинні поглянути на MS Concurrency & Coordination Runtime (CCR) та Децентралізовані програмні послуги (DSS) , частину Robotic Studio .

Ці рамки дозволять вам розробляти вільно пов'язані між собою послуги, які відповідають більшості вимог щодо підходу до актора.

Axum найкраще підійде, на жаль, він все ще перебуває в якійсь альфа / бета-фазі (ОНОВЛЕННЯ, його було вбито в лютому 2011 р.) Я використовую його для своїх досліджень і повинен сказати, що загальний напрямок є великим і він має величезний потенціал.

Не C #, а C ++ - це бібліотека асинхронних агентів Microsoft, яка надає всі необхідні функції.

Уважно ознайомтеся з паралельними функціями .NET 4.

Сподіваюся, це допоможе!


6
і я знайшов це тут: code.google.com/p/retlang
alex25

дякую за вашу вичерпну відповідь.
Borba

Потік даних TPL містить будівельні блоки для агентів / акторів на C #
Дмитро Лагода

Посилання ccrdss тепер мертве - про потоки даних TPL (TDF) тут говорять: msdn.microsoft.com/en-us/concurrency/default.aspx та тут: msdn.microsoft.com/en-us/devlabs/gg585582 (хоча Думаю, друге посилання рано чи пізно
зіпсується

Оновлення посилання потоку даних TPL: msdn.microsoft.com/en-us/library/vstudio/…
BozoJoe

56

Фреймворки .NET Actor Model:

Прото.актор

  • Актори
  • Віртуальні актори

https://github.com/AsynkronIT/protoactor-dotnet

Akka.NET

  • Актори

https://github.com/akkadotnet/akka.net

Microsoft Орлеан

  • Віртуальні актори

https://github.com/dotnet/orleans


Цей проект з відкритим вихідним кодом також має хороші обіцянки github.com/louthy/language-ext // Процес журналу var logger = spawn <string> ("logger", Console.WriteLine); // Процес пінгу ping = spawn <string> ("ping", msg => {tell (logger, msg); tell (pong, "ping", TimeSpan.FromMilliseconds (100));}); // Процес понгу pong = spawn <string> ("pong", msg => {tell (logger, msg); tell (ping, "pong", TimeSpan.FromMilliseconds (100));}); // Trigger tell (pong, "start");
Dasith Wijes

25

Можна також поглянути на підхід Project Orleans Microsofts до акторів (який вийшов минулого тижня)

Це веб-сайт проектів: http://research.microsoft.com/en-us/projects/orleans/

Ось також хороша розмова від збірки 2014 як вступ

Використання Орлеана для побудови розподілених хмарних служб Halo 4 в Azure http://channel9.msdn.com/Events/Build/2014/3-641

Зверніть увагу, що біти для завантаження, опубліковані сьогодні, - це CTP.

Вступ до Орлеана: http://felixnotes.com/orleans-microsofts-take-on-the-actor-pattern-in-net/

І так, це також було відкритим кодом: https://github.com/dotnet/orleans


1
На жаль, це пов’язує вас із Лазурним ...
День

2
Я вважаю, що бажано запустити Azure (оскільки це від Microsoft), але не обов’язково, але не впевнений на 100%.
silverfighter

здається, навіть розробники не впевнені :) orleans.codeplex.com/discussions/543928
Den


Який із трьох найкраще підійшов би?
Gerard

18

Стакт

Актор-lib на .Net. Досить грамотно і добре перевірено. Основа TopShelf, MassTransit та NServiceBus.Host.

https://github.com/phatboyg/stact

Містить абстракції:

  • Робочий процес, що дозволяє визначати та виконувати складні протоколи, керовані станом
  • Канали для підтримки передачі повідомлень між об'єктами
  • Актори, як друковані, так і анонімні
  • Волокна, модель кооперативної різьби
  • Маршрутизація
  • Запит / відповідь
  • Планувальники

Майбутні:

  • Належні ієрархії наглядачів

Будучи активно розвивався на момент написання Крісом.

Огляд:

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

Stact - це бібліотека для побудови програм, що використовують модель актора в .NET. Основна збірка, Stact.dll, є бібліотекою акторів і включає все необхідне для використання моделі актора в будь-якому додатку. Існують також додаткові допоміжні фреймворки, такі як Stact.ServerFramework, які можна використовувати для викриття акторів через сокети або HTTP, що дозволяє будувати служби за допомогою акторів.


Щойно побачив розмову про документ від @phatboyg у Øredev. Дуже багатообіцяючий
svrist

Здається, штакт більше не розробляється активно.
Ронні Овербі

13

NAct - це структура акторів для .NET, яка застосовує дуже простий у використанні підхід. (Застереження: я це написав)

Повідомлення, що передається між двома акторами, є лише викликом методу між двома об'єктами. Ви повинні переконатися, що всі аргументи методу є незмінними, і він буде безпечним для потоків.

Це працює, обертаючи ваші об'єкти в проксі, який займається перемиканням потоків. Усі нормальні функції .NET, зокрема події, обробляються правильно, тому ви можете писати звичайний код, і маршоутворення потоків відбуватиметься самостійно.

Існує навіть гілка з підтримкою C # 5 async / await.


Чи не могли б Ви приділити трохи свого часу розширенню Stact замість того, щоб створювати нову структуру? Мені було б дуже цікаво бачити, як ваше асинхронне мислення пронизує більше Stact (я не є його автором, але мені це дуже подобається).
Генрік

Хм, я дуже радий, що будь-яка реалізація Actors набирає популярності, але я все ще шанувальник робити це за допомогою викликів методів. Порівняйте їх із (випадково однаковими) зразками коду за допомогою Stact та NAct: github.com/phatboyg/Stact/wiki/Samples-Ping-Pong та code.google.com/p/n-act/wiki/PingPong
Алекс Девіс

1
Я віддаю перевагу семантиці передачі повідомлень, оскільки вона відповідає тому, що вона робить, і немає можливості легко продемонструвати, наприклад, періодичний збій мережі або причину, коли паралельність та годинник повідомлень надсилаються, коли це не явно. Якби я сьогодні брав участь у фреймворці, я б розширив F # MailboxProcessor, який і без того працює дуже добре - з наглядачами та полегшенням передачі повідомлень через мережу.
Генрік

Я щойно створив EasyActor, філософія якого подібна до NAct. Основними відмінностями Nact є те, що він підтримує результати, отримані від акторів із Task <T>, і базується на Castle Core DynamicProxy для перехоплення викликів методів. Тест сирих показників також вказує на покращену продуктивність грубих 40% у тесті для пінг-понгу.
Девід Десмейсон,

5

Сьогодні корпорація Майкрософт анонсувала Azure Service Fabric, яка відповідно до цієї картини реалізує модель програмування актора:

Тканина служби Azure

Див. Оголошення: http://azure.microsoft.com/blog/2015/04/20/announcing-azure-service-fabric-reducing-complexity-in-a-hyper-scale-world/

Оновлення: SDK тепер доступний, а також є відеоурок .


4

Я не знаю жодної реалізації для C #, але є цілком нова мова програмування, заснована на моделі Actor від Microsoft. Це називається Axum :

Axum(раніше називалася кодовою назвою Maestro) - це паралельна мова програмування, що базується на моделі Actor, розробленій корпорацією Майкрософт. Це об’єктно-орієнтована мова, заснована на середовищі виконання .NET Common Language, що використовує C-подібний синтаксис, який, будучи мовою для конкретного домену, призначений для розробки частин програмного додатку, які добре підходять для паралельності. Але він містить достатньо загальних конструкцій, що не потрібно переходити до мови програмування загального призначення (наприклад, C #) для послідовних частин паралельних компонентів.


Дякую за вашу відповідь. Axum здається цікавим, але на перший погляд, я думаю, варіант AC # більше підходить для моєї проблеми.
Borba

3
На жаль, проект був убитий MS
CharlesB

@CharlesB Бібліотека TPL DataFlow замінила це, чи не так?
EJoshuaS

@EJoshuaS Я не маю уявлення
CharlesB

2

Ви розглядали MailboxProcessor of T, що постачається з F #?



1

Remact.Net - це мій поточний проект. Він використовує WebSockets та Json для обміну повідомленнями з віддаленими акторами. Він має безпеку типів для акторів C #, але також підтримує динамічні типи для акторів на основі браузера, написаних сценарієм Java.

Моїм попереднім проектом був AsyncWcfLib . Це бібліотека C # для акторів, які спілкуються в процесі або між різними програмами. Віддалене передавання повідомлень використовує WCF.
Служба каталогу акторів дозволяє виявити акторів на декількох хостах. Хости можуть працювати під управлінням Windows або Linux.


0

FSharp. Актор

Фреймворк актора для F #.

З прикладу:

let rec schizoPing =
    (fun (actor:IActor<_>) ->
        let log = (actor :?> Actor.T<_>).Log
        let rec ping() =
            async {
                let! (msg,_) = actor.Receive()
                log.Info(sprintf "(%A): %A ping" actor msg, None)
                return! pong()
            }
        and pong() =
            async {
                let! (msg,_) = actor.Receive()
                log.Info(sprintf "(%A): %A pong" actor msg, None)
                return! ping()
            }
        ping()
    )

Надсилання двох повідомлень актору "шизо" призводить до

let schizo = Actor.spawn (Actor.Options.Create("schizo")) schizoPing

!!"schizo" <-- "Hello"
!!"schizo" <-- "Hello"

Вихід:

(schizo): "Hello" ping
(schizo): "Hello" pong

Знайдіть його на github та в документації


0

Просто помітив це запитання і подумав додати новішу точку даних. Наразі Microsoft має для цього напівофіційний проект, який називається ActorFX . Це з відкритим кодом і все ще розвивається, але варто стежити за ...


0

Як уже зазначалося, клас F # MailboxProcessor пропонує просту, зрозумілу реалізацію моделі актора. Чудовий вступ про те, як ним користуватися, доступний тут . F # дуже добре взаємодіє з C #, і ви можете обернути агент у класі методами, які публікують різні повідомлення. У випадках, коли агент відповість асинхронною відповіддю, див. Метод PostAndAsyncReply . Це повертає робочий процес Async, який ви можете перетворити на завдання, яке можна очікувати в C #, використовуючи метод Async.StartAsTask .

Нарешті, якщо вам потрібно віддалено розподілити своїх акторів, я рекомендую вам перевірити Akka.NET, який пропонує як API C #, так і F #.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.