0%

初识Actor - 从Scala库开始

旧版本Scala中的Actor库(scala.actor)

教程

重点

Actor设计

  • Reactor
    • ReplyReactor
      • Actor
  • Reactor:提供事件模型能力&&基本的收发功能(包括事件存储分发&&状态控制&&调度&&异常处理)
    • sendBuffer:其他地方对 reactor send xxx 的时候,会放入的buffer
    • mailbox:读取数据,会先从buffer中读到mailbox里,再被处理
  • ReplayReactor:记录了sender,对他发送消息可以收到回复。并提供回复功能reply&&发送并回复功能!?!!
  • Actor
    • 提供了receive这个同步方法
    • link和unlink方法, 参考用法
    • trapExit,用法参考上面的例子

常用操作

  • 接收数据
    • react
    • receive
    • reactWithin
    • receiveWithin
  • 发送
    • send 或者 ! 异步发送,无返回
    • !? 同步发送 返回类型是Option[Any]
    • !! 异步发送 返回Feature
    • reply == sender ! msg (sender返回消息的发送者)
  • 控制

Schedule设计

scheduler用于执行一个Reactor实例
学习源码了解Actor中schedule结构
IScheduler接口

  • DelegatingScheduler — 委托类
    • Scheduler 一个单例object
    • DaemonScheduler
  • ForkJoinScheduler(默认) — 使用ForkJoinPool执行任务 了解ForkJoin模型底层原理
  • ResizableThreadPoolScheduler/ExecutorScheduler/SingleThreadedScheduler 其他方式执行任务:各种线程池
  • SchedulerAdapter — 自定义Scheduler时使用,使用上面的单例Scheduler

ManagedBlocker原理:优化forkJoinPool中的io操作—某个线程阻塞时,启用新线程(Actor中在阻塞调用之前总会使用他通知ForkJoinPool)

调度对象:
ForkJoinTask接口

  • RecursiveTask
  • RecursiveAction
    • ReactorTask(actor控制的核心实现 — Control异常的处理)
      • ReplayReactorTask
        • ActorTask
          • Reaction

Channel

Channel的作用:

  • 提供『固定类型』的数据传输(对比Actor|Reactor是Any类型)

Channel设计:

  • channel内部其实封装了一个Actor(名字是receiver),他本质上就是实现了一个数据类型的转换(InputChannel&&OutputChannel接口中定义的方法)
  • 因此,在功能上相同(Actor实现了InputChannel&&OutputChannel(父类Reactor中))

Channel的共享方法:

  • 直接传递Channel的引用
  • 在消息中传递Channel

实例代码

Future的使用

  • Actor的 !!操作返回future
  • 直接使用Feature处理异步问题
  • 参考代码

Remote

惯用法:RemoteActor.classLoader= getClass().getClassLoader()

区分:block vs suspend==receive vs react

如何表示空的偏函数
https://stackoverflow.com/questions/7188933/empty-partial-function-in-scala

欢迎关注我的其它发布渠道