mutable.ListBuffer
で何か問題が起きていることがわかりましたが、修正方法や問題の適切な説明がわかりません。Scala:ListBufferを追加して並列実行すると、予期しない結果が生成されない
以下のコードを単純化して動作を再現しました。
私は、最初のリストが処理されるときに、基本的に並行して関数を実行して、リストに要素を追加しようとしています。私は "失う"要素に終わる。
返しimport java.util.Properties
import scala.collection.mutable.ListBuffer
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
import scala.concurrent.{ExecutionContext}
import ExecutionContext.Implicits.global
object MyTestObject {
var listBufferOfInts = new ListBuffer[Int]() // files that are processed
def runFunction(): Int = {
listBufferOfInts = new ListBuffer[Int]()
val inputListOfInts = 1 to 1000
val fut = Future.traverse(inputListOfInts) { i =>
Future {
appendElem(i)
}
}
Await.ready(fut, Duration.Inf)
listBufferOfInts.length
}
def appendElem(elem: Int): Unit = {
listBufferOfInts ++= List(elem)
}
}
MyTestObject.runFunction()
MyTestObject.runFunction()
MyTestObject.runFunction()
:
明らかres0: Int = 937
res1: Int = 992
res2: Int = 997
を私は1000
はすべての時間を返されることを期待します。私のコードを修正して "アーキテクチャ"を維持するが、ListBufferを "同期"させるにはどうすればよいですか?
synchronized {
listBufferOfInts ++= List(elem)
}
に
listBufferOfInts ++= List(elem)
を変更
大変ありがとうございます! – Stephane