Учитывая контекст выполнения и пул потоков, как актеры / scala участники запланированы/реализованы на этом?
Как акковые актеры реализованы в подстилающих потоках?
Ответ 1
Я был в замешательстве с этой темой в течение длительного времени. Я предположил, что существует определенная связь между нитями и актерами. Для каждого актера есть поток, который размещает его, поэтому я думал. Вероятно, для каждого потока работает несколько участников, которые работают в режиме совместной многозадачности.
Документация ориентирована на использование и внутреннюю защиту внутренней архитектуры. Вам просто нужно расширить класс Actor
, и вы получите действующего актера. Поэтому я попытался угадать, как это можно сделать. И предположил, что каждый Actor
имеет жизненный цикл. Что-то вроде асинхронного ожидания для очереди сообщений. Затем обработайте сообщение. Нажмите, чтобы начать.
Это было абсолютно ложное предположение. Хотя в документации говорится "жизненный цикл актера", это не означает жизненный цикл Actor
. Актер, упомянутый, представляет собой концепцию, а не фактический объект, реализующий класс Actor
. Объект остается пассивным в куче java.
Чтобы вдохнуть жизнь в концепцию, необходима скоординированная работа с участием кучки реальных работников. И сердце его - диспетчер. Он содержит всех участников, потоков и сообщений. И когда ресурсы становятся доступными, и есть сообщение, доступное для обработки, диспетчер активируется. Он принимает подходящий объект Actor
, обертывает его метод получения в runnable и передает его в запасную нить. Таким образом, для объекта не существует жизненного цикла только случайные вызовы методов из системы актеров.
Когда вы думаете об этом, это имеет гораздо больше смысла, чем схема, которую я предполагал раньше. Но мне было трудно вывести его из имеющейся документации. Это было написано опытными программистами concurrency. Отличается тем, что удерживает класс актера от концепции актера за ним. Они знают, что диспетчер для актерской системы подобен планировщику задач для ОС. Таким образом, они быстро доходят до сути и описывают различные вкусы, и реализация предполагаемой концепции должна быть знакома всем.
Но это не так легко для новичков. Он не знаком с образцом диспетчера в контексте актерских систем. Я попробовал Google "шаблон диспетчера", и он показал, что он не имеет отношения к определениям системы актеров.
Я легко нашел двойную отправку, многоотчетную и другие темы ООП. Я нашел нечто похожее на akka routers диспетчер сообщений. Существует, вероятно, достойное описание для диспетчеров сообщений актера, но найти его не так просто.
Надеюсь, я очистил недоразумение.
Ответ 2
В "Я искал что-то более похожее на то, что вам дается пул потоков из 10 потоков и 50 актеров, выделенных из него, как столько актеров обрабатывается партией из 10 потоков?"
Точное поведение зависит от диспетчера и конфигурации. Однако большинство диспетчеров делают в основном что-то вроде этого:
- Выберите актера с непустым почтовым ящиком
- Затем "actor" отправляется на выполнение исполнителем
- Если сообщения обрабатываются и обрабатываются.
- Когда возможно, несколько сообщений делятся и обрабатываются один за другим
- После обработки некоторых сообщений (или их не осталось) другой актер выбирается для предотвращения голодания. (пропускная способность)
- Поднимитесь и повторите
Ответ 3
Вы можете найти соответствующую информацию в документации akka, которая довольно полная, насколько это возможно.
По сути вы можете выбрать/определить диспетчеров и назначить для них участников через конфигурацию (через файлы или код).
Каждая реализация диспетчера основана на каком-то исполнителе.