了解并行存在并找到

Lui*_*hys 9 parallel-processing scala parallel-collections

我采取List[Int]和要搜索的值x,其中x * 10 > 500并行.因此,如果列表包含任何值51或更大,exists则应返回true.

def f(x: Int) = {
  println("calculating for " + x)
  Thread.sleep(100 - x)
  println("finished " + x)
  x * 10
}

val res = List.range(1, 100).par.exists(f(_) > 500)
Run Code Online (Sandbox Code Playgroud)

结果如下:

calculating for 1
calculating for 25
calculating for 50
calculating for 75
calculating for 13
finished 75          // <-- first valid result found: 75 * 10 > 500
finished 50
calculating for 51   // but it kicks off more expensive calculations
finished 25
calculating for 26   
finished 13
calculating for 14   
finished 1
calculating for 2
finished 51
finished 26
calculating for 27   // and more
finished 14
calculating for 15
finished 2
calculating for 3
finished 27
calculating for 28
finished 15
calculating for 16
finished 3
calculating for 4    // and more...
finished 28
calculating for 29
finished 16
calculating for 17
finished 29
calculating for 30
finished 4
calculating for 5
finished 17
calculating for 18
finished 30
finished 5
calculating for 6
finished 18
finished 6
res: Boolean = true
Run Code Online (Sandbox Code Playgroud)

我正在使用Scala 2.9.1的双核机器.

这里发生了什么?这是否按预期工作?为什么不在发现第一个结果后立即将消息发送给其他线程以中止任务?如果f计算成本昂贵,这可能会非常昂贵.

find 似乎以类似的方式工作,搜索更多的值,即使文档说"元素可能不一定是迭代顺序中的第一个这样的元素"和"选择是不确定的".

use*_*own 1

我理解这种愿望,因为我认为自己有这样的行为会很好 - 从使用快速退出代码的意图来看,期望它看起来是合理的,但是当然,应该如何实现?

在快捷表达式中,如果找到结果,则不会启动下一个调用 - 这很容易。

但是,如何运行一个未触发的任务并再次捕获它以停止它呢?您需要知道它们中的哪一个已经完成,并且可能进入竞争条件,因为在测试时,它是否仍在运行,它可能返回“true”,但之后立即完成。

内部调用的函数exists本身可以启动新线程 - 一般如何从外部停止它们?也许通过提供可选的stop execution-method 作为第二个参数?