Учитывая некоторую проблему параллелизма, что бы вы искали, чтобы решить, использовать ли актеров или нет?
Сначала я хотел бы определить проблему ... является ли основной мотивацией ускорение вложенного цикла for или рекурсии? Если это так, то простой подход, основанный на задачах, или подход с параллельным циклом, скорее всего, сработает для вас (а не для актеров).
Однако если у вас есть более сложная система, включающая зависимости и координацию общего состояния, вам может помочь акторный подход. В частности, благодаря использованию акторов и семантики передачи сообщений вы часто можете избежать использования явных блокировок для защиты общего состояния, фактически создавая копии этого состояния (сообщения) и реагируя на них.
Вы можете легко сделать это с помощью классических задач синхронизации, таких как проблема обедающих философов и проблема спящих парикмахеров. Но вы также можете использовать «актора», чтобы помочь с более современными шаблонами, т.е. ваш фасад может быть актором, ваше представление модели и контроллер также могут быть акторами, которые взаимодействуют друг с другом.
Еще одна вещь, которую я заметил, заключается в том, что семантика акторов доступна большинству разработчиков и «безопаснее», чем их заблокированные аналоги. Это связано с тем, что они повышают уровень абстракции и позволяют вам сосредоточиться на координации доступа к этим данным, а не на защите всех доступов к данным с помощью блокировок. В качестве примера представьте, что у вас есть простой класс с элементом данных. Если вы решите поместить блокировку в этот класс для защиты доступа к этому члену данных, то любые методы этого класса должны будут гарантировать, что они обращаются к этому элементу данных под блокировкой. Это становится особенно проблематичным, когда другие (или вы) изменяют класс позже, им приходится помнить, чтобы использовать эту блокировку.
С другой стороны, если этот класс становится актором, а член данных становится буфером или портом, с которым вы общаетесь через сообщения, вам не нужно помнить о блокировке, потому что семантика встроена в буфер, и вы будете очень явно знать собираетесь ли вы блокировать это в зависимости от типа буфера.
-Рик
person
Rick
schedule
29.11.2009