Ответ 1
Я считаю, что Sharability относится к числу/типу участников, которые могут совместно использовать диспетчер определенного типа. Я не уверен в переборке, но я предполагаю, что это относится к какому-либо разделению актеров, где вы хотите, чтобы один актер "владел" потоком.
Ниже приведены описания комментариев кода /scaladoc для различных типов диспетчеров. Если требуется больше разъяснений, пожалуйста, опишите, что неясно:
грузоотправитель:
Основанный на событии Dispatcher
связывает набор Актеров с пулом потоков, резервным копированием которого является BlockingQueue
.
BalancingDispatcher:
Диспетчер, управляемый событиями, основанный на исполнителях, который попытается перераспределить работу от занятых участников на бездействующих участников. Предполагается, что все участники, использующие один и тот же экземпляр этого диспетчера, могут обрабатывать все сообщения, отправленные одному из участников. То есть актеры принадлежат к пулу актеров, а к клиенту нет никакой гарантии, какой экземпляр актера фактически обрабатывает данное сообщение.
Хотя технология, используемая в этой реализации, обычно известна как "кража работы", фактическая реализация, вероятно, лучше всего описывается как "работа пожертвования", потому что актер, из которого крадется работа, берет инициативу.
PinnedDispatcher:
Посвящает уникальный поток для каждого актора, переданного в качестве ссылки. Выполняется через messageQueue.
CallingThreadDispatcher (в akka.testkit):
Диспетчер, который запускает вызовы только для текущего потока. Этот диспетчер не создает никаких новых потоков, но может использоваться из разных потоков одновременно для одного и того же актера. Стратегия отправки должна выполняться в текущем потоке, если целевой актор не будет приостановлен или уже запущен в текущем потоке (если он работает в другом потоке, то этот поток будет блокироваться до тех пор, пока этот другой вызов не будет завершен); если вызов не запущен, он ставится в очередь в потоковой локальной очереди, которая будет выполняться после завершения активного вызова до завершения стека вызовов. Это приводит к полностью детерминированному исполнению, если используется только один поток.
Приостановка и возобновление - это глобальные действия для одного актора, то есть они могут влиять на разные потоки, что приводит к осложнениям. Если сообщения приостановлены (поточно локально) в течение приостановленного периода, единственным потоком для их запуска при возобновлении является поток, фактически вызывающий метод возобновления. Следовательно, все поточно-локальные очереди, которые в настоящее время не сливаются (возможно, поскольку suspend-queue-resume может произойти полностью во время вызова в другом потоке) зачерпнуты в текущую очередь потоков, которая затем выполняется. Можно приостановить действие актера из его стека вызовов.