• scala之Akka的Actor模型(上)


    原文地址:http://my.oschina.net/jingxing05/blog/287213

    明确并行和并发

    看两张图

    并行parallelism

    gophersimple4

    并发concurrency

    gophercomplex0

    关键点在于 多个任务之间 有没有 交流和交互的!

    交流: 共享内存(Lock  信号量)   消息驱动           交互:竞争

    一段顺序的相同代码 同时 多份 运行  并行,并行不悖!!!多条车道

    而当把这段顺序的代码再分成几个独立的执行小段,对各个小段可以同时执行,并产生交流时

    并发   一条道上 多辆车 可以超车

    多线程是并行的,但不一定是并发的,如果没有交互

    没有对共享变量的操做,根本无需考虑所谓并发的问题

    参考 http://wangcong.org/blog/archives/2054

     

    Actor模型

    Actor模型的要点

    • 基于Actor的系统中 Actor是最小的抽象单元,  就像object 之于 oop
    • 一个Actor封装了状态和行为
    • 外界不能进入Actor以获取其状态、字段、执行方法,和Actor的交互只能通过message
    • 一个Actor有一个信箱mailbox,将外部发送来的消息msg存到队列中
    • Actor的终生就是在等待msg,并依次取出mailbox中的消息进行处理

    Actor模型的组织观

    • 将Actor系统视为一个公司,从上到下有严格的层级关系,公司中员工是person,也是actor
    • 一个Actor仅有一个上级主管 称为 supervisor,就是create这个Actor的 那个Actor
    • 一个Actor可能有多个下属小兵,真正干着脏累差活的actor
    • 一个Actor可能有多个同级的兄弟部门actor

    开发actor系统的关键

    • 委托 委托 委托!!! 以做的更多!
    • 公司老总不能事无巨细全部承担,他的主要工作就是分配公司工作和监督
    • 各部门主管收到任务,要么自己干,要么再细分任务,然后分配到自己的下属手中并监督
    • 如果公司还有更多的层级,则继续上面这个主管的龌龊勾当
    • 最底层的员工收到细粒度任务,干着自己最擅长的事情

    Actor的失效处理

    • 人无完人,Actor也不可能100%完成任务
    • 如果任务执行失败,一个Actor会挂起自己及其下属,然后发消息告诉其上级主管“我失败了”!
    • 上级主管收到下属的“失败”消息时,可以有如下反应:
      1. 失败就失败,就这样吧,没太大关系:保持当前状态,恢复Actor,继续工作
      2. 没成功啊,那重新做一遍吧             :重置状态,重启该Actor
      3. 没机会了,失败了你就滚!解雇下属:关闭 终结 该 Actor
      4. 这事我也决定不了,我请示我的上级:向上级Actor报告

    Akka实现的Actor模型的一些附加特性

    • 实例化一个Actor时,返回一个ActorRef,相当于 邮箱地址,并不能通过这个获取Actor的状态信息
    • Actor模型是线程的更高层抽象,最终是跑在java的线程中的
    • 多个Actor可能共享一个线程,这是由akka保障的
    • Actor的信箱有多种实现方式:无限变量信箱    有限信箱    带优先级信箱, 还可以自定义实现
    • akka没有让Actor扫描信箱的message
    • 一个Actor终结(无论是正常还是非常的)它的信箱中的msg进入akka系统的“死信箱dead letter mailbox”中

  • 相关阅读:
    Oracle 在64位机器上使用plSQL连接Oracle的问题(SQL*Net not properly installed)
    Bytes to be written to the stream exceed the Content-Length bytes size specified 解决方法
    Eclipse下建立geoserver源码工程
    (转)HttpWebRequest以UTF-8编码写入内容时发生“Bytes to be written to the stream exceed the Content-Length bytes size specified.”错误
    为nginx创建windows服务自启动
    (转)Nginx反向代理设置 从80端口转向其他端口
    从SNE到t-SNE再到LargeVis
    K NEAREST NEIGHBOR 算法(knn)
    从0开始用python实现神经网络 IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION
    Python和数据科学的起步指南
  • 原文地址:https://www.cnblogs.com/shenlanzifa/p/5288740.html
Copyright © 2020-2023  润新知