foreach in Scala parallel collections



我用Ammonite评估了这个代码:

$ amm
Welcome to the Ammonite Repl 2.5.1 (Scala 2.13.8 Java 17.0.1)
@ import $ivy.`org.scala-lang.modules::scala-parallel-collections:1.0.4`
@ import scala.collection.parallel.CollectionConverters._
@ Seq(1,2).foreach { x => Thread sleep x*1000; println(s"Fin $x") };println("Fin") 
Fin 1
Fin 2
Fin

它完成得很好。如果我添加par进行并行化,那么它永远不会完成:

@ Seq(1,2).par.foreach { x => Thread sleep x*1000; println(s"Fin $x") };println("Fin")

这是个虫子吗?在Scala 2.12中,我得到了同样的行为。

您遇到这个问题是因为Scala的lambda编码也会在Scala REPL中出现这个错误。

Scala方面的错误:https://github.com/scala/scala-parallel-collections/issues/34

相应的菊石虫报告如下:https://github.com/com-lihaoyi/Ammonite/issues/556

据我所知,你可以通过两种方式来解决这个问题。第一种是把你的并行工作放在一个物体里,例如

object work {
def execute() = Seq(1, 2).foreach { x =>
Thread.sleep(x * 1000); println(s"Fin $x")
}; println("Fin")
}
work.execute

我相信用amm --class-based运行Ammonite也应该做到这一点,但我现在还无法测试。

相关内容

最新更新