Когда следует использовать модель актера?
Когда следует использовать модель актера?
Это, конечно, не гарантирует отсутствие тупиков.
Актер A может ждать сообщения от B, пока B ждет A.
Кроме того, если субъект должен убедиться, что его сообщение было обработано, прежде чем перейти к следующей задаче, он должен будет отправить сообщение и дождаться сообщения "Ваше сообщение было обработано" вместо прямой блокировки.
В чем сила модели?
3 ответа
Учитывая некоторые проблемы параллелизма, что вы будете искать, чтобы решить, использовать актеров или нет?
Сначала я хотел бы определить проблему... является ли основная мотивация ускорением вложенного цикла или рекурсии? Если так, то простой подход, основанный на задачах или подходе с параллельным циклом, вероятно, будет работать хорошо для вас (а не для участников).
Однако, если у вас более сложная система, которая включает зависимости и координирует общее состояние, тогда может помочь подход с участием акторов. В частности, используя акторы и семантику передачи сообщений, вы часто можете избежать использования явных блокировок для защиты общего состояния, фактически делая копии этого состояния (сообщения) и реагируя на них.
Вы можете сделать это довольно легко с классическими проблемами синхронизации, такими как обедающие философы и проблема спящих парикмахеров. Но вы также можете использовать "актер", чтобы помочь с более современными шаблонами, то есть ваш фасад может быть актером, ваш вид модели и контроллер также могут быть актерами, которые общаются друг с другом.
Еще одна вещь, которую я заметил, заключается в том, что семантика акторов может быть изучена большинством разработчиков и "безопаснее", чем их заблокированные аналоги. Это связано с тем, что они повышают уровень абстракции и позволяют сосредоточиться на координации доступа к этим данным, а не на защите доступа к данным с помощью блокировок. В качестве примера представьте, что у вас есть простой класс с элементом данных. Если вы решите установить блокировку в этом классе для защиты доступа к этому элементу данных, то любые методы этого класса должны будут гарантировать, что они получают доступ к этому элементу данных под блокировкой. Это становится особенно проблематичным, когда другие (или вы) изменяют класс позднее, они должны помнить об использовании этой блокировки.
С другой стороны, если этот класс становится субъектом, а элемент данных становится буфером или портом, с которым вы общаетесь с помощью сообщений, вам не нужно забывать брать блокировку, потому что семантика встроена в буфер, и вы будете очень точно знать, собираетесь ли вы блокировать это в зависимости от типа буфера.
-Rick
Использование Actor является "естественным" как минимум в двух случаях:
- Когда вы можете разложить свою проблему на множество независимых задач.
- Когда вы можете разложить свою проблему на набор задач, связанных четким потоком операций (т. Е. Программированием потока данных).
Например, если вы обрабатываете сложные данные, используя серию фильтров, легко использовать конвейер акторов, где каждый актор получает данные от вышестоящего субъекта и устанавливает данные для нижестоящего субъекта.
Конечно, этот поток данных не должен быть линейным, и если шаг в вашем конвейере медленный, вы можете использовать вместо этого пул актеров, выполняющих ту же работу. Другим способом решения проблем балансировки нагрузки может стать использование подхода, основанного на спросе, организованного с помощью некой виртуальной системы Kanban.
Конечно, вам потребуется синхронизация между актерами почти во всех интересных случаях, но в отличие от классического многопоточного подхода, эта синхронизация действительно "конкретна". Вы можете представить себе парней на фабрике, представить возможные проблемы (работникам не хватает работы, начальные операции выполняются слишком быстро, а промежуточным продуктам требуется огромное место для хранения и т. Д.) По аналогии вы можете найти решение более легко.
Я не эксперт по акторам, но вот мои 2 цента, когда использовать модель акторов: модель акторов не подходит для каждого параллельного приложения, например, если вы создаете приложение, которое является многопоточным и работает в модели акторов с высокой степенью параллелизма, не создается для решения проблемы параллелизма. Актеры действительно вступают в игру, когда вы создаете приложение, управляемое событиями. Например, у вас есть приложение, и вы отслеживаете, что пользователи нажимают в вашем приложении в реальном времени. Вы можете использовать акторов для выполнения действий в реальном времени, разделенных по пользователям, устройствам или любым другим требованиям вашего бизнеса, поскольку акторы имеют состояние. Так, например, если некоторые пользователи лежат в актерах, которые нажалиshirts
вы можете отправить им уведомление о каком-то купоне. Также некоторые приложения, в которых могут пригодиться участники: финансы (ценообразование, обнаружение мошенничества), многопользовательские игры.
Действующие лица являются асинхронными и одновременными, но не гарантируют порядок сообщений или ограничение по времени относительно того, когда на сообщение можно воздействовать. Следовательно, атомарные транзакции не могут быть разделены на актеров.
Если в приложении / задаче нет изменяемого состояния, то актеры излишни, так как структуры акторов идут на все, чтобы избежать условий гонки.