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

У меня есть коллекция, на которую я звоню .par, как это:

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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам