我拿了一个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)
这给出了结果:
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
我正在使用带有 Scala 2.9.1 的双核机器。
这里发生了什么?这是否按预期工作?为什么它不在找到第一个结果后立即向其他线程发送消息以中止任务?f
如果是昂贵的计算,这可能会非常昂贵。
find
似乎以类似的方式工作,搜索更多的值,即使文档说“元素可能不一定是迭代顺序中的第一个这样的元素”和“选择是不确定的”。