Ответ на ваш вопрос напрямую; есть good article на этой самую тему:
Опять же, если вы затянувшееся вычисления, имея их работать в отдельных исполнениях ExecutionContext для CPU переплете задача является хорошей идеей.
В статье имеет следующий пример:
import java.util.concurrent.Executors
import concurrent.ExecutionContext
//I added 'private' for the rest of the example
private val executorService = Executors.newFixedThreadPool(4)
private val executionContext = ExecutionContext.fromExecutorService(executorService)
Ответ на косвенно,
Фьючерсы Первого
Я полностью согласен, что Akka Актеры являются очень полезным инструментом для конкретных типов Работа. Когда дело доходит до кеширования, Actors
& Agents
- лучшая игра в городе.
Однако в этом случае я бы предложил использовать Future
вместо Актера. Вы можете сделать veryLongProcess функцией private
. Конфиденциальность обеспечит полный контроль над количеством потоков, вызывающих метод:
def longProcessFut(start : Int, noOfElements : Int) : Future[Result] = Future {
veryLongProcess(start, noOfElements)
}(executionContext)//controls the executing pool of veryLongProcess
Простой, лаконичный и асинхронный.
Отсутствие убийства писем, отсутствие перегруженного метода приема, который принимает что-либо под солнцем, а также реквизит, даже для ActorRef не было необходимости в будущем. Блум, пивной живот, я говорю!
Кроме того, ваш пользователь будет не создать будущее, независимо от того, что из-за ?
:
//Actor user code, too verbose
val longProcessRef = actorSystem actorOf Props[Worker]
val fut : Future[Result] = (longProcessRef ? Work(0,42)).mapTo[Result]
По сравнению с использованием фьючерсов непосредственно
//happy user code
val fut : Future[Result] = longProcessFut(0, 42)
То же большое будущее, но половина калорий!
Вы можете управлять диспетчером Будущего так же, как это предложено в комментариях, что довольно хорошо. Вы даже можете использовать actorSystem.dispatcher
в качестве диспетчера будущего для управления поведением диспетчера.
Вы можете настроить диспетчер должен быть подходящей моделью потока для вашего приложения. Вероятно, вы хотите настроить отдельный пул потоков для диспетчера, выполняющего медленные задачи, и оставить диспетчера по умолчанию для других участников, выполняющих непродолжительные задачи. http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html, это хорошая идея, чтобы прочитать все документы, когда приходите в такую богатую структуру, чтобы получить представление обо всех настраиваемых частях. – simbo1905
Хорошо, это имеет смысл. Думаю, моя забота заключается в том, что у Akka есть какой-то тайм-аут или какая-то другая особенность, которая после определенного количества прошедшего времени предположила, что актер умер. –
По моему опыту, работа просто тащится в почтовых ящиках актера до тех пор, пока вы не закончите кучу или нити. Таким образом, управление ресурсами - это то, что вам нужно сконструировать в конфигурации. Простые вещи просты, возможны сложные вещи. Мой верхний совет не делает все актером. Фьючерсы также являются вашим другом и используют только актеров, чтобы упростить многозадачность и дистанционное управление. – simbo1905