2014-10-24 2 views
0

Философия, лежащая в основе Akka/Scala Future, заключается в том, что когда мы находим блокирующую часть кода, такую ​​как вызов IO, сетевой вызов и т. д. мы должны завершить его в будущем и асинхронно получить результат через некоторый момент времени. Но блокирующая часть кода, которая ранее блокировала основной поток, теперь блокирует в отдельном потоке, в котором поддерживается будущее. то, что Akka/Scala Future покупали нас.Блокирующий код, заключенный внутри Akka Future, также блокирует поток, поддерживаемый Future, тогда как будущее полезно в этом случае

val blockingCallResult: Result = block() //blocks the thread of execution. 

now let's use Akka/Scala future and wrap the blocking call with Future 


val future = Future[Result] { 

    val blockingCallResult: Result = block() //also blocks on some thread in thread pool 

    blockingCallResult 

} 

Как мы получаем выгоду от использования будущего.

+3

На данный момент мотивация для этого вопроса неясна. Вам действительно сказали, что ** только ** преимущество будущего - это нерестование рабочих? Вы взглянули на ['Future' API] (http://www.scala-lang.org/api/2.11.2/#scala.concurrent.Future)? –

+0

@ TheTerribleSwiftTomato ... Являясь новичком ко всем этим понятиям. Пожалуйста, помогите мне и исправьте меня, если я буду похож на «глупо». в любом случае это не что-то будущее? я все еще не могу понять, как будущее обрабатывает блокирующие вызовы, чтобы сделать его не блокирующим и избежать ожидания, блокируя, потому что если будущее поддерживается опросом нитей, то какой-то или другой поток блокируется при выполнении вызовов IO (если IO не является блокируя, как тот, который предлагает Акка). это не правда?. Почему мы говорим, что будущее помогает в создании кода. Не блокируется, а не только асинхронно. – pamu

+1

Нет, вы не говорите глупо, задавая вопросы об основных понятиях, это полностью действительный (если не используется) способ продвижения. В этот момент, чтобы ответить, я хотел бы попросить вас предоставить источники заявлений, на которые вы ссылаетесь. Это позволит мне (или кому-либо еще) просматривать вопросы в контексте этих источников. –

ответ

4

Если у вас есть только один контекст выполнения, и вы используете только фьючерсы, которые выполняют блокирующий код, и только по одному, то, действительно, нет никакого преимущества от использования будущего. Преимущества фьючерсов:

  • Параллельность - на многоядерной машине одновременно могут выполняться несколько потоков. Использование фьючерсов с контекстом выполнения позволяет избежать накладных расходов на создание нового потока для каждого действия или повторное использование потоков вручную, а контекст выполнения дает вам контроль над размером пула.
  • Разделение ввода-вывода и вычисление потоков с использованием различных контекстов выполнения. Это позволяет ядру планировать интерактивные ответы на ввод-вывод перед долговременными вычислительными задачами, улучшая латентность.
  • Истинный асинхронный ввод-вывод, например. scala-redis-nb (или Netty или ReactiveMongo (?)). Вместо того, чтобы будущее было потоком, который блокируется, можно выставить асинхронный API (тип, который в противном случае мог бы использовать обратные вызовы) с использованием Futures (например, через Promises), а затем вы можете написать действительно асинхронный код, который позволяет избежать блокировки любых потоков I/O и с гораздо более удобным API, чем напрямую с помощью API-интерфейса, основанного на обратном вызове.
+0

привет, я новичок в akka, и у меня есть похожий случай, с вызовом API (блокирующего) отдыха внутри будущего. если я хорошо понимаю, хорошим решением является настройка отдельного диспетчера для этого фьючерса, чтобы не повлиять на остальную систему akka. это правильно? Thnaks !! – naaka

+0

Я бы сказал, что ваш лучший подход заключается в использовании async http-клиента, такого как клиент-распылитель. – lmm