Будет ли вызов.seq в параллельных коллекциях гарантировать, что все потоки объединены?
У меня есть коллекция, на которую я звоню .par
, как это:
myCollection.par.map(element => longRunningOperation(element)).seq
println("after map")
Будет звонить .seq
гарантировать, что все потоки объединены перед продолжением, и все карты завершены, перед вызовом println?
2 ответа
Рабочие потоки запускаются, как только map
операция вызывается. Все они объединены рамками до map
операция завершена. К тому времени, когда вы звоните seq
больше нет работающих рабочих потоков.
Да, это будет. Действительно, вам не нужно звонить .seq
в конце.
Простой способ ответить на подобные вопросы - помнить, что при отсутствии побочных эффектов параллельные коллекции имеют точно такую же семантику, что и непараллельные коллекции. Если код в вашем longRunningOperation не имеет видимых побочных эффектов, единственный способ, которым вы сможете сказать, что код выполняется параллельно, - это проверка загрузки процессора.