Ответ 1
Это определение актера фактически кажется немного ограничительным. Он, конечно, не справляется с актерами в стиле Эрланг (или, я считаю, Scala). По моему опыту, актер - это то, что:
- Отправляет и принимает сообщения (каждый участник имеет почтовый ящик)
- Не передает измененную память другим участникам
- Планируется на основе капризов времени выполнения. Актеру может быть предоставлена собственная нить, но более вероятно, что несколько участников участвуют в кооперативной многопоточности в одном потоке или, возможно, даже участвуют в упреждающей многопоточности.
Но в принципе, актер - это свободно работающий кусок кода, который может получать сообщения из своей среды и может отправлять сообщения обратно в свою среду.
Актеры используются в любое время, когда вам нужно много (и много) процессов с небольшим количеством состояний. Сетевое взаимодействие является распространенным случаем, поскольку вы не хотите выделять весь поток для каждого соединения. Вы хотите что-то более легкое, поэтому вы выделяете актера для каждого соединения, а затем планируете актеров на меньшем пуле потоков. Но общение, конечно, не единственное использование актеров.
В Эрланге актер является функцией. Функция, вероятно, вызывает хвост (так что это в основном бесконечный цикл), и он, вероятно, имеет чистый способ самоограничения (бесконечный цикл имеет условие "break" ). Цикл обычно ожидает сообщения от системы, обрабатывает его и затем отправляет сообщения в остальную часть системы. В библиотеке Erlang OTP есть некоторые абстракции, которые устраняют необходимость даже писать цикл, поэтому актер OTP реализуется как набор обратных вызовов. Таким образом, актер OTP очень похож на объект.