首先让我说我有很多Java经验,但是直到最近才对函数式语言感兴趣。最近,我开始研究Scala,这似乎是一种非常不错的语言。
但是,我一直在Scala编程中阅读有关Scala的Actor框架的信息,有一件事我不理解。在30.4章中说,使用react
代替receive
可以重新使用线程,这对性能有好处,因为在JVM中线程很昂贵。
这是否意味着,只要我记得打电话react
而不是receive
,我就可以启动任意数量的Actor?在发现Scala之前,我一直在和Erlang一起玩,而Programming Erlang的作者自豪地介绍了20万个以上的过程而又不费吹灰之力。我讨厌用Java线程来做到这一点。与Erlang(和Java)相比,我在Scala中看到的是什么限制?
另外,该线程如何在Scala中重复使用?为了简单起见,我们假设我只有一个线程。我开始的所有参与者都将在该线程中按顺序运行,还是会进行某种任务切换?例如,如果我启动两个彼此进行乒乓球消息的演员,那么如果他们在同一线程中开始,是否会陷入僵局?
根据Scala编程的规定,编写要使用的演员比使用演员react
困难receive
。听起来似乎很合理,因为react
没有回来。但是,本书继续说明了如何使用可以将react
循环放入循环中Actor.loop
。结果,您得到
loop {
react {
...
}
}
在我看来,这与
while (true) {
receive {
...
}
}
在本书的前面使用过。本书仍然指出,“实际上,程序至少需要几个receive
”。那我在这里想念什么?除了回报之外还能receive
做什么react
?我为什么要在乎呢?
最后,进入我不了解的核心内容:这本书不断提到使用如何react
使丢弃调用堆栈以重用线程成为可能。这是如何运作的?为什么有必要放弃调用堆栈?当函数通过抛出异常(react
)终止而不能通过返回(receive
)终止时,为什么不能丢弃调用堆栈呢?
我的印象是,Scala编程已经掩盖了这里的一些关键问题,这真是令人遗憾,因为否则它是一本真正优秀的书。