2014-02-01 2 views
0

В этом блоге о параллельных коллекций в Scala http://beust.com/weblog/2011/08/15/scalas-parallel-collections/Что подразумевается под параллелизмом в этом случае?

Это упоминается на комментарий Даниэль Spiewak:

Другие люди уже комментировал о примере mkString, поэтому я собирается уходить это одно. Он действительно отражает гораздо больший смысл в семантике коллекции в целом. В основном это: в отсутствии побочных эффектов (в пользователь), параллельные коллекции имеют точный та же семантика, что и последовательные коллекции. Другими словами: ForAll {(хз: Vector [A], F: A => B) => (xs.par отображение е) == (хз отображение F) }

Означает ли это, что, если нет побочных эффектов, параллелизм не достигается? Если это правда, эта точка может быть расширена, чтобы объяснить, почему это так?

ответ

3

Он всегда будет работать параллельно, но результат может различаться при наличии побочных эффектов.

Скажем A = Int и B = Int с помощью следующего кода:

var tmp = false 

def f(i: Int) = if(!tmp) {tmp = true; 0} else i + 1 

Итак, мы имеем функцию F с побочным эффектом. Я предполагаю, что tmp - это false перед запуском кода.

Запуск Vector(1,2,3).map(f) всегда будет приводить к Vector(0,3,4)

Но Vector(1,2,3).par.map(f) может иметь разные результаты. Это может быть Vector(0,3,4), но, поскольку его параллель, второй элемент, возможно, отображается первым и т. Д. Так что может произойти что-то подобное Vector(2,0,4).

Вы можете быть уверены, что результат будет таким же, если в этом случае f не будет иметь побочных эффектов.

+0

@ Kiygo Итак, когда .map применяется к коллекции параллельно, упорядочение элементов в новой сопоставленной коллекции зависит от того, когда каждая функция карты заканчивает обработку на каждом элементе? –

+0

Я думаю, что порядок элементов всегда остается неизменным. Просто порядок, в котором функция f применяется к элементам, может различаться, так как она параллельна, и я предполагаю, что некоторые гонки участвуют. – Kigyo

4

Означает ли это, что при отсутствии побочных эффектов параллелизм не достиг ?

Нет, это не то, что это значит. Когда Даниил Spiewak говорит, что

В основном, это он: в отсутствии побочных эффектов (в пользовательском коде), параллельных коллекции имеют точно такую ​​же семантику, что и последовательные коллекций.

Это означает, что если ваша функция не имеет побочных эффектов, то ее использование для сопоставления с простой коллекцией или параллельной коллекцией даст тот же результат. Вот почему:

Иными словами: forAll {(xs: Vector [A], f: A => B) => (xs.п отображение е) == (хз отображение е)}

, если f является побочным эффектом бесплатно.

Итак, на самом деле все наоборот: если есть параллелизм побочных эффектов, это не очень хорошая идея, так как результат будет непоследовательным.

Смежные вопросы