2016-06-01 6 views
5

В моем потоке есть четное сочетание ступеней с привязкой к CPU и IO (каждый этап IO сопровождается стадией процессора). Я хочу сделать операции ввода-вывода другим диспетчером, чем остальная часть потока.Поток Akka - перенос потока с привязкой IO к другому диспетчеру

В приложении, основанном на традиционном акторе Akka, я мог бы поставить своих участников IO на фиксированный диспетчер пула потоков с большим количеством потоков, в то время как привязанные к процессору актеры на объединении пула вил с небольшим количеством потоков (несколько кратных, в идеале 1, от числа ядер). Это должно сократить время, затрачиваемое на переключение потоков для привязанных к процессору субъектов, в то же время увеличивая пропускную способность за счет большого количества потоков, блокирующих IO.

Это понимание правильно? Если нет, то почему? Если да, то как мне поместить мои связанные ступени (потоки) в отдельный диспетчер из остальной части потока?

Я попытался отключить автоматическое слияние, и это действительно помогает. Но он все еще имеет намного меньшую пропускную способность, чем почти эквивалентный аналог Akka.

ответ

8

по умолчанию является то, что все этапы в потоке запускаются на тот же актер, можно отметить, что этапы должны выполняться на отдельный диспетчеру с помощью атрибутов, например, так:

stage.withAttributes(ActorAttributes.dispatcher("dispatcher-name")) 

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

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

stage.withAttributes(Attributes.inputBuffer(1, 1)) 

Соответствующие части документации:

+0

спасибо за ответ. Это то, что я искал. – anindyaju99

+0

Что делать, если я хочу вернуть ответ и продолжать работать в фоновом режиме? [Это] (https://gist.github.com/asarkar/37e4cb026c463f6334617e923cfc4b12), похоже, работает. –

Смежные вопросы