Актеры: основанные на нити против даже управляемых - PullRequest
0 голосов
/ 11 мая 2018

Читая об актерском программировании, я столкнулся с потоковыми актерами и актерами, управляемыми событиями.

Какая разница между двумя? И когда использовать какие?

1 Ответ

0 голосов
/ 13 мая 2018

Модель Actor сама по себе является спецификацией параллелизма. С точки зрения модели акторов не существует понятия «события», «потоки» или «процессы», только субъекты и сообщения.

Это на самом деле одно из преимуществ модели Actor в том, что она использует другой подход к параллелизму, который обеспечивает большую изоляцию. Любая общая информация должна передаваться через сообщения, а обработка конкретного сообщения является атомарной, поэтому во время выполнения обработчика сообщений субъекта не требуется никаких специальных методов параллельной синхронизации.

Напротив, потоки работают в общей области памяти, что требует тщательной координации обновлений памяти (посредством мьютексов и блокировок) или имитированного обмена информацией (через очереди ... с блокировками или мьютексами). Процессы реализуют модель параллелизма, которая больше похожа на субъекты в том, что они обеспечивают большую изоляцию, но не имеют встроенной поддержки обмена сообщениями, поэтому обмен информацией часто должен строиться и управляться внутри процесса через каналы или сокеты и соответствующие протоколы и управление ресурсами. ; Актеры обеспечивают эту функциональность обмена сообщениями «из коробки».

Практически, большинство операционных систем предоставляют реализации параллелизма "процесс" и "поток" вместо Actors, поэтому используемая вами среда Actor должна будет отобразить ваши Actors на базовую модель параллелизма операционной системы. Некоторые делают это путем реализации каждого субъекта в виде отдельного потока, другие путем реализации субъекта как отдельного процесса, другие - с использованием одного или нескольких потоков и итерацией набора акторов для передачи сообщений. Даже управляемые событиями реализации, такие как Beam (виртуальная машина Erlang), должны будут выполнять это отображение, если они хотят использовать несколько контекстов процессора, и между виртуальной машиной и оборудованием имеется операционная система.

Когда вы пишете свои актеры, вы пишете в эту абстракцию параллелизма, и вам не следует беспокоиться о каком-либо переназначении модели параллелизма, обрабатываемом вашей платформой Actor Framework: это цель и сфера действия структуры.

К сожалению, поскольку ОС управляет системными ресурсами, а модель параллелизма ОС (вместе с вашим языком) обычно строится вокруг модели потока и / или процесса, вам необходимо учитывать влияние сопоставления при работе с системой. Ресурсы. Например, если ваш Actor написан на C и будет выполнять системный вызов read () для файла или сокета, управляемая событиями модель приведет к остановке all Actors, тогда как поток или процесс - основанная модель акторов должна позволять другим акторам продолжать обработку, в то время как другой актор блокируется при вызове read (). В этом же сценарии, но с использованием CPython (например), модель Actor, управляемая событиями, и многопоточная, все равно будет блокировать все другие акторы из-за CPYthon GIL, но модель Python Actor, основанная на процессах, будет по-прежнему разрешать одновременный Actor выполнение. Многие фреймворки Actor предоставляют дополнительные функциональные возможности, помогающие поддерживать абстракции модели Actor при использовании системных ресурсов, поэтому вам придется проверять детали вашей Framework при написании Actors, которые взаимодействуют с ресурсами, управляемыми ОС (особенно в режиме блокировки).

Некоторые Actor Frameworks способны изменять режим реализации на основе параметров конфигурации запуска (например, запуск в зависимости от параметра запуска в зависимости от события, в потоке или в зависимости от процесса). Это может быть очень полезно; например, простое тестирование с использованием совместной однопоточной реализации позволяет воспроизводить и понимать результаты тестирования, в то время как производственное приложение все еще выполняется с полным параллелизмом и без изменений.

В общем, при написании актеров вы должны пытаться использовать методы параллелизма на основе акторов и переносить любые внешние интерфейсы, на которые может повлиять базовая реализация, на край вашего проекта, где их можно легко изменить при необходимости.

...