Tim*_*ske 5 parallel-processing scala scala-collections
在Scala REPL中输入以下小顺序程序及其并行化版本:
/* Activate time measurement in "App" class. Prints [total <X> ms] on exit. */
util.Properties.setProp("scala.time", "true")
/* Define sequential program version. */
object X extends App { for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}}
/* Define parallel program version. Note '.par' selector on Range here. */
object Y extends App { for (y <- (1 to 10).par) {Thread.sleep(1000);println(y)}}
Run Code Online (Sandbox Code Playgroud)
执行X with X.main(Array.empty)给出:
1
2
3
4
5
6
7
8
9
10
[total 10002ms]
Run Code Online (Sandbox Code Playgroud)
而Y与Y.main(Array.empty)给出:
1
6
2
7
3
8
4
9
10
5
[total 5002ms]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是该程序的以下两种变体如何:
object X extends App {(1 to 10).foreach{Thread.sleep(1000);println(_)}}
object Y extends App {(1 to 10).par.foreach{Thread.sleep(1000);println(_)}}
Run Code Online (Sandbox Code Playgroud)
分别给我[total 1002ms]和我的运行时间[total 1002ms].怎么会这样?
这与并行集合无关.问题隐藏在函数文字中.如果让编译器显示AST(带选项-Xprint:typer),你可以看到它:
for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}
Run Code Online (Sandbox Code Playgroud)
产生
scala.this.Predef.intWrapper(1).to(10).foreach[Unit](((x: Int) => {
java.this.lang.Thread.sleep(1000L);
scala.this.Predef.println(x)
}))
Run Code Online (Sandbox Code Playgroud)
而
(1 to 10).foreach{Thread.sleep(1000);println(_)}
Run Code Online (Sandbox Code Playgroud)
产生
scala.this.Predef.intWrapper(1).to(10).foreach[Unit]({
java.this.lang.Thread.sleep(1000L);
((x$1: Int) => scala.this.Predef.println(x$1))
})
Run Code Online (Sandbox Code Playgroud)
有一点不同.如果您想要预期的结果,则必须将foreach-expression更改为
(1 to 10).foreach{x => Thread.sleep(1000);println(x)}
Run Code Online (Sandbox Code Playgroud)
但有什么区别?在你的代码中,你向块声明一个块foreach,在执行块后,它将返回要执行的函数.然后将此返回的函数传递给foreach包含它的块而不是包含它的块.
这个错误经常发生.它与下划线文字有关.也许这个问题可以帮到你.
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |