Будет ли вызов .seq в параллельных коллекциях гарантировать, что все потоки объединены? - PullRequest
2 голосов
/ 19 августа 2011

У меня есть коллекция, для которой я вызываю .par, например:

myCollection.par.map(element => longRunningOperation(element)).seq
println("after map")

Будет ли вызов .seq гарантировать, что все потоки объединены перед продолжением, и все карты завершены, перед вызовом println?

Ответы [ 2 ]

8 голосов
/ 19 августа 2011

Рабочие потоки запускаются после вызова операции map. Все они объединяются платформой до завершения операции map. К тому времени, когда вы вызываете seq, рабочие потоки больше не выполняются.

4 голосов
/ 19 августа 2011

Да, будет. В самом деле, вам не нужно звонить .seq в конце.

Простой способ ответить на подобные вопросы - помнить, что при отсутствии побочных эффектов параллельные коллекции имеют точно такую ​​же семантику, что и непараллельные коллекции . Если код в вашем longRunningOperation не имеет видимых побочных эффектов, единственный способ, которым вы сможете сказать, что код выполняется параллельно, - это проверка загрузки процессора.

...