Tag: 线程的

斯卡拉演员:接受vs反应

首先让我说,我有相当多的Java经验,但最近才对函数式语言感兴趣。 最近我开始看Scala,这看起来像一个非常好的语言。 不过,我一直在阅读关于Scala 编程中的 Scala的Actor框架,还有一件事我不明白。 在30.4章节中,它表示使用react而不是receive来重用线程,这对性能是有好处的,因为在JVM中线程是很昂贵的。 这是否意味着,只要我记得要求react而不是receive ,我可以像我喜欢的那样开始尽可能多的演员? 在发现Scala之前,我一直在玩Erlang, 编程Erlang的作者吹嘘产卵超过200,000进程没有打破汗水。 我讨厌用Java线程来做到这一点。 与Erlang(和Java)相比,我在Scala中看到了什么样的限制? 另外,这个线程如何在Scala中重用? 为了简单起见,我们假设我只有一个线程。 我会开始在这个线程中顺序运行的所有演员,还是会进行某种任务切换? 例如,如果我启动了两个互相发送消息的演员,如果他们在同一个线程中启动,我是否会冒死锁的风险? 根据斯卡拉编程 ,编写演员使用react比receive更困难。 这听起来似乎合理,因为react不会返回。 然而,本书继续展示如何使用Actor.loop在循环内部react 。 结果,你得到了 loop { react { … } } 对我而言,这看起来很相似 while (true) { receive { … } } 这在本书的早些时候使用。 不过,这本书说,“实际上,程序至less需要几个receive ”。 那么我在这里错过了什么? 除此之外,还有哪些能做的react呢? 为什么我在乎 最后,谈到我不明白的核心:本书不断提及如何使用react使得可以放弃调用堆栈来重用线程。 这是如何运作的? 为什么有必要放弃调用堆栈? 为什么当一个函数终止抛出一个exception( react ),而不是当它通过返回( receive )终止时,可以抛弃调用栈? 我有一个印象, Scala编程一直在掩盖一些关键的问题,这是一个耻辱,因为否则它是一本非常出色的书。