Монады и Актеры - PullRequest
       45

Монады и Актеры

7 голосов
/ 30 августа 2010

Я пытался найти что-нибудь, что обсуждает, когда вы должны отдавать предпочтение использованию монад над актерами (в сценариях параллелизма), но я ничего не нашел. В частности, меня интересует использование Reactive Extensions (LINQ to Events) против F # MailboxProcessor. Пожалуйста, приведите примеры в дополнение к любым философским рассуждениям, которые у вас могут быть.

Обновление Для лучшего контекста Reactive Extensions реализуют монаду продолжения в форме IObservable / IObserver. Я не обязательно говорю, что должен использовать F #, просто у F # есть конкретная «модель актора», доступная на языке .NET в форме MailboxProcessor <'T>.

То, что я пытаюсь понять, - это когда использовать монаду (в данном случае монаду продолжения) по сравнению с актерской моделью для целей параллелизма. Если монада (насколько я понимаю) не вводит состояние, у субъекта есть собственное внутреннее состояние, которое изменяется по мере необходимости для обеспечения защищенного доступа.

Я видел несколько примеров использования обоих: Rx и node.js (CPS, на самом деле не монада продолжения) против F # MailboxProcessor и платформы Scala Akka. Я просто не знаю, почему ты выбрал одно из другого.

Ответы [ 4 ]

4 голосов
/ 30 августа 2010

Я не уверен, что вопрос имеет смысл, поскольку сформулирован - есть много различных монад (например, монада идентификаторов, монада списков, монада опций, ...), большинство из которых не имеют ничего общего с параллелизмом.Кроме того, было бы полезно узнать больше о конкретном сценарии, с которым вы имеете дело - «параллелизм» - это немного туманная тема.В зависимости от того, чего вы пытаетесь достичь, рабочие процессы F # async (которые основаны на монаде Async) могут быть лучшим выбором.

Если вы используете F #, я бы рекомендовал противнепосредственное использование LINQ-to-что угодно, поскольку эти библиотеки выглядят очень чуждо при доступе через F #.Однако вы можете создать приятные обертки F # (например, существующие модули Seq и Observable).Кроме того, для монадических типов вы можете создать построитель выражений вычислений (например, вы можете создать построитель, используя Reactive Extensions, который позволит вам использовать выражения вычислений для построения и компоновки IObservable s).

1 голос
/ 11 сентября 2016

Примете ли вы ответы из мира Scala?

Если вы ищете «чисто функциональную альтернативу актерской модели», пожалуйста, посмотрите этот великий пост из блога Пола Кьюзано

pchiusano.blogspot.ro / 2010/01 /ctors-are-not-good-concurrency-model.html (архивировано здесь: http://archive.is/NxNLc)

и некоторые ссылки ниже:

http://noelwelsh.com/programming/2013/03/04/why-i-dont-like-akka-actors/

Актерыне составлять актеров Akka, которые не являются полезными типами. Система типов является причиной, по которой мы используем Scala.

https://opencredo.com/akka-typed/

К сожалению, текущий API страдает несколькими недостатками., которые в значительной степени связаны с отсутствием безопасности типа

http://doc.akka.io/docs/akka/snapshot/scala/typed.html

Статус этого проекта и отношение к актерам Akka Типизированный Akka является результатоммного лет исследований и предыдущих попыток (включая Typed Channels в серии 2.2.x), и он находится на пути к стабилизации, но для столь глубокого изменения основной концепции Akka потребуется много времени

Побочным эффектом этого является то, что поведение cТеперь тесты можно тестировать изолированно, без необходимости упаковки в Actor, тесты могут выполняться полностью синхронно, не беспокоясь о тайм-аутах и ​​случайных сбоях.Другим побочным эффектом является то, что поведение может быть красиво составлено и декорировано

Композитная архитектура приложения с недорогими монадами

Концепция «стиля передачи функций» от Хизер Миллер может стать ключом к распределенной модели функционального программирования.

SF Scala: Heather Miller, Функциональный стиль, Новая модель для распределенного программирования

Обновление 12/2018 : теперь мы можем использовать Aecor, которые предоставляют средства для:

  • реализует бизнес-логику с функциональными programming model и
  • , использующими Akka основанные runtime

"принадлежащие кУровень домена и время выполнения находятся на уровне инфраструктуры. "

Источник: https://pavkin.ru/aecor-part-3/, http://aecor.io

1 голос
/ 30 августа 2010

Пожалуйста, извините моего новичка, поскольку я только изучаю F #.

Я заинтригован, увидев использование RX вместо MailboxProcessor, если у вас есть ссылки на соответствующие материалы.

С моим ограниченным пониманием;Я бы выбрал MbP в своем собственном коде, так как события немного запутаны в F # (из того, что я могу взять из этой статьи: MSDN ).И вам нужны события, чтобы RX мог подключиться к праву?

Где, как и в случае с MbP, все, что мне нужно, - это различенное объединение сообщений, список функций, которые я хочу выполнить при получении данного сообщения.И процессор почтовых ящиков, который обрабатывает это.

Все это выглядит довольно аккуратно в коде.Я могу связать свои MbP вместе в модуле, тогда мой «объектный» модуль выглядит как

  • Запись
  • Сообщение DU
  • Оболочка с некоторыми геттерами и сеттерами, которые публикуют данныена MbP

Для меня это выглядит намного лучше, чем если бы я написал свой код с событиями, как описано в той статье MSDN, на которую я ссылался.

Хотя я всего лишьF # младший, так что я могу быть далеко от моего счета, и это скорее взгляд, а не выбор для цели (поскольку я еще не готов сделать такой вызов)

0 голосов
/ 07 февраля 2011

Я собираюсь ответить на мой собственный вопрос и сказать, что вы должны использовать оба.Это основано на сообщении Дона Сайма .MbP использует вычисления Async для выполнения своей работы, а Async является монадой продолжения с поддержкой потоков.Похоже, вы можете использовать его самостоятельно для некоторых целей, но MbP определенно требует его.

Мне не очень нравится этот ответ, и я был бы рад, если бы кто-то ответил лучшеобъяснение того, когда использовать каждый из них.

Обновлено:

См. MiniRx , который теперь отличается от FSharpx , для реализации монады в стиле Rx, реализованной с использованием MailboxProcessor.Поскольку MailboxProcessor сам реализован с использованием монады async, они действительно работают вместе.Это просто разные средства абстракции.

...