2016-03-07 6 views
5

Из хорошо написанный Akka Concurrency:Akka Future - параллельная или параллельная?

enter image description here

Как я понимаю диаграмма указывает, как numSummer и charConcat будет работать на том же потоке.

Можно ли запускать каждый Future параллельно, то есть на отдельные потоки?

+2

можно утверждать, что эта цифра должна быть названа «Flatma pping одновременно и последовательно », учитывая, что левый является совпадающим. – mdm

+0

Но' concurrent' подразумевает повторное использование того же потока, нет? –

+0

Не обязательно, насколько я понимаю. http://stackoverflow.com/questions/1897993/difference-between-concurrent-programming-and-parallel-programming или https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming; Последовательность будет заключаться в отсутствии перекрытия между выполнением. – mdm

ответ

11

Изображение слева is их работающие параллельно.

Пункт иллюстрации состоит в том, что метод Future.apply - это то, что начинается с исполнения, поэтому, если это не произойдет до тех пор, пока результат первого будущего не станет flatMap ed (как на картинке справа) t получить параллельное выполнение.

(Обратите внимание, что «стартовал», я имею в виду соответствующий ExecutionContext говорят о работе. Как это параллелизует другой вопрос и может зависеть от таких вещей, как размер его пула потоков.)

Эквивалент код слева:

val numSummer = Future { ... } // execution kicked off 
val charConcat = Future { ... } // execution kicked off 
numSummer.flatMap { numsum => 
    charConcat.map { string => 
    (numsum, string) 
    } 
} 

и права:

Future { ... } // execution kicked off 
    .flatMap { numsum => 
    Future { ... } // execution kicked off (Note that this does not happen until 
        // the first future's result (`numsum`) is available.) 
     .map { string => 
     (numsum, string) 
     } 
    }