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