Actors and Concurrency in Scala

口水话(抄书)《Scala Cookbook》第 13 章 『Actors and Concurrency』。

第 13 章 Actors and Concurrency

介绍

在 Scala 中你可以继续用 Java 线程,但是我们更倾向于用 Actor 模型来实现并发。Actor 模型比线程提供了不知道高到哪里去了的抽象层,并且一旦你理解了这个模型,那你就懂了那你就可以 focus 在如何解决手上的问题,而不是担心我怎么这么菜怎样写底层的线程啊/锁啊/数据共享啊/ blahblah。

尽管早期的 Scala 版本原生自带 Actor 依赖库,但是从 Scala-2.10.0 开始,他开始转向使用一个比原来的 lib 更健壮的依赖库——由 Typesafe 开发的 Akka actor 依赖库。然后从 Scala-2.10.1 开始 Scala 官方就废弃掉了原先的 scala.actors 依赖包……

总而言之呢,actors 能帮你提供更高级别的抽象,从而实现并发和并行。除此之外呢, Akka 的 actor 包还有以下几点优势:

  • 轻量级,事务驱动型进程。官方文档说 1GB 内存能跑 270 万个 actors。
  • 容错性。我们可以用 Akka actors 来构建一个“自愈系统”。(Akka 团队的博客域名就叫LetItCrash好嚣张啊(现在已经搬走了,看起来官方亿点
  • 位置透明。Akka actors 可以跨多个 JVM 或者服务器;从最初的设计开始,他就是通过发送单纯的消息从而能够在分布式环境中运行的(they’re designed to work in a distributed environment using pure message passing)。

“高层次的抽象”也可以理解为“易于使用”。看懂这个模型并不需要多长时间,一旦你看明白了,你就可以写一些复杂的并发应用,这会比你用基础的 Java 依赖包简单得多。我用 Akka actors 写了一个叫 SARAH 的通过说话进行交互的应用(语音输入,文本转语音输出),并且这个应用可以长时间地在后台运行。用 actors 来写这些代码比用同等级的线程方法可简单太多太多了。

我喜欢把一个 actor 看作是一个在别人的服务器上的、我不能直接控制的一个 web service。比如,我可以通过向他发消息来让他做些事,或者问他一些信息,但我不能直接进入这个 service 里面去修改他的状态,或者拿到他的资源;我只能通过他提供的 API,类似于发送一些不可修改的消息。一方面来说,这有天然的局限性,但是为了安全地写出一些并行的方法的话,这样的好处是很大的。

Actor 模型

以下内容可以在深入探索这一章的菜谱之前帮助理解 Actor 模型。

要理解 Actor 模型,第一件事是要理解 actor 的概念:

  • 当构建一个基于 actor 的系统时, actor 是这里面最小的单元,类似于面向对象编程系统中的一个对象。
  • 跟对象相似,一个 actor 也封装了自己的状态和行为。
  • 你不能通过窥视一个 actor 的内部来了解他的状态。你可以向他发一条消息来请求状态信息(就像问一个人,嘿,你怎样了),但是你不能直接进入
其他特性

[TBD]

深得我心!博主晚餐加鸡腿!