rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Scala

Scala 的杂记6:actors

Scala 除了模式匹配和强大的下划线以外,另一个闪光点就是并发模型 Actor。 Actor 是一种响应消息的对象,处理消息的时候,它可以: 

  • 改变自身状态
  • 产生新的 Actor
  • 发送新的消息

此过程可能是异步的,也可能是同步的。 
和 Thread 类有点相似吧? scala 的 actor 的实现里,有个私有类 ActorProxy 就是包装线程对象的。但是 Actor 比线程更细小:譬如产生两个 Actor,可能只需要 1 个线程。事实上 Scala 的 Actor 在初始化时,创建一个含 4 个 Thread 的线程池,如果所有线程都阻塞了,线程池会增长。 Actor 的历史和 message passing 和 process calculi 有些关系。(见 wiki) message passing,或者说 messaging 
C++ 和 java 与其说是面向对象语言,不如说是面向类的语言。 
Alan Kay 说过:。 
C++ 式的成员方法更像是一种语法糖和设计上的 guideline:obj.method() 结果是要被翻译成 method(obj) 的。 
而在 messaging 的系统中,中间多了一个消息分发。obj.method() 意味着向 obj 发送 method 消息。 消息分发的系统更灵活,更具扩展性(譬如一些程序中可以在运行时添加新的消息响应),C++ 和 Java 没有内建的 messaging,于是是人们就想出了类似 signal/slot,event/listener 这些概念 ―― 它们本质上都是一个 messaging 的系统。 
消息分发的另一个优点就是: 消息可以发给多个对象,对象的响应也可以是异步的。缺点是分发时会有一些额外的开销。 process calculus 
Erlang 的 process 大概就是从 process 代数中来的。 process 代数中,P 和 Q 并行,可以表达为 P|Q,[待续补完 ……] actor 
actor 的概念表达成三元组的话,就是 (message, mailbox, behavior)。scala 中的实现: 

  • message 一般可以设计成 case class (方便进行匹配)的实例;
  • actor 已经内建了 mailbox (消息队列);
  • behavior 通过 receive 或 react 代码块来设定。
顶一下
(0)
踩一下
(0)