Scala тупик с параллельными коллекциями - PullRequest
7 голосов
/ 04 ноября 2011

Почему следующий код создает тупик:

object Test extends Application
{
  def printProgress(i:Int) =
  {
    println("Processed " + i)
  }

  println("A")
  (1 to 1000).par.foreach{ i =>  
    printProgress(i)
  }   
  println("B")
}

(т.е. печатается A, но не печатаются ни B, ни какие-либо из строк Processed ....)

Однако следующий код не вызывает взаимоблокировки:

object Test extends Application
{
  println("A")
  (1 to 1000).par.foreach{ i =>  
    println("Processed " + i)
  }   
  println("B")
}

(т.е. все печатается.)

Я использую Scala версии 2.9.1.final.

1 Ответ

13 голосов
/ 04 ноября 2011

Возможно, потому что вы расширяете Application, пока я не могу сказать, в чем разница между вашими двумя примерами.

В приложении код выполняется вне метода main в классе инициализации.В данный момент JVM строго ограничена, особенно в том, что касается многопоточности.Приложение устарело в пользу App, у которого есть некоторая магия (черта DelayedInit), которая заставляет код выполняться в main.Так что object Test extends App должно это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...