Scala ожидает выполнения foreach для параллельной коллекции

У меня есть код, как показано ниже

    val g = new Graph(vertices)

        //Firts part

        (1 to vertices).par.foreach( i => g + new Vertex(i))

       //Second part

          for (i <- 1 to edges) {
            val data = scala.io.StdIn.readLine()
            val d = data.split(" ")
            val v1 = d(0).toInt
            val v2 = d(1).toInt
            val length = d(2).toInt
            g+(v1, v2, length)
        }

Я хочу последовательно выполнить первую и вторую часть кода. В настоящее время цикл for выполняется до того, как все вершины будут добавлены в g. В коде + (плюс) определить добавить новый экземпляр Vertex в MutableList.

Я новичок в scala, пожалуйста, помогите


person matiii    schedule 29.06.2015    source источник
comment
Можете ли вы показать реализацию Vertex и Graph   -  person anquegi    schedule 29.06.2015


Ответы (3)


Вы можете обернуть каждый вызов в следующем

new Thread(new Runnable {
  override def run(): Unit = {
    //Code part here:
  }
}).start()

Вам также необходимо убедиться, что ваша реализация Graph является потокобезопасной, поскольку у вас будет два потока, изменяющих ее одновременно.

Не похоже, что вы что-то возвращаете из любой части, но если бы вы были, вы могли бы использовать вместо этого Future. Подробнее см. здесь.

person nattyddubbs    schedule 29.06.2015

Параллельная коллекция только распараллеливает вычисления для коллекции. Вторая часть вычислений, где вы добавляете ребра, должна происходить после добавления вершин.

Я бы предположил, что в результате синтаксического анализа могут быть некоторые вершины, которых вообще не существует в вершинах, может быть какое-то пустое пространство или что-то в этом роде.

Я не уверен в том, что происходит при добавлении вершин в граф, но foreach на parallel должен быть осторожен, если операция не должна иметь побочных эффектов. См. это для получения дополнительной информации. Может быть, это даже не актуально.

person Biswanath    schedule 29.06.2015

Я узнаю решение. Я читал больше о добавлении новых элементов в коллекцию параллельно, и это не сохранение потока. Я заменил MutableList на массив фиксированного размера и добавил новый элемент по индексу.

Некоторый код ниже:

class Graph(val end: Int) {

  private val vertices : Array[Vertex] = new Array[Vertex](end)

  def +(index: Int, v: Vertex): Unit = {
    vertices(index) = v
  }  

  (...)
}

     //Firts part
      (1 to vertices).par.foreach( i => g + (i-1,new Vertex(i))) //add new vertex to array by index
person matiii    schedule 30.06.2015