Взаимоблокировка Scala с параллельными коллекциями

#scala #deadlock

#scala #взаимоблокировка

Вопрос:

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

 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. warning: there were 1 deprecation warnings это намек на то, что все не совсем так 🙂

Ответ №1:

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

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

Комментарии:

1. Это волшебный ответ, я буду иметь это в виду в отношении моей будущей работы. XD