Scala学习(十)Scala的Actor

本文介绍了Scala中的并发编程,对比了与Java并发的不同。重点讲述了Scala的Actor模型,包括Actor的概念、ActorSystem的层次结构、ActorPath的描述、获取Actor引用的方法以及Actor和ActorSystem的角色。还探讨了actorOf、actorSelection和actorFor的区别,并给出了Actor的示例。
摘要由CSDN通过智能技术生成

一、Scala中的并发编程

(1)Java中的并发编程

①Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要。 

②Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程去访问这个共享的数据(主要是对这个共享的数据进行修改),同时Java利用加锁的机制(即synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而保证共享数据的一致性。 

③Java中的并发编程存在资源争夺和死锁等多种问题,因此程序越大问题越麻烦。 

(2)Scala中的并发编程

①Scala中的并发编程思想与Java中的并发编程思想完全不一样,Scala中的Actor是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况。在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹配并进行相应的处理。 

②如果Actor A和 Actor B要相互沟通的话,首先A要给B传递一个消息,B会有一个收件箱,然后B会不断的循环自己的收件箱, 若看见A发过来的消息,B就会解析A的消息并执行,处理完之后就有可能将处理的结果通过邮件的方式发送给A。

二、Scala中的Aactor

(1)什么是Actor

一个actor是一个容器,它包含 状态, 行为,信箱,子Actor 和 监管策略,所有这些包含在一个ActorReference(Actor引用)里。一个actor需要与外界隔离才能从actor模型中获益,所以actor是以actor引用的形式展现给外界的。

(2)ActorSystem的层次结构

如果一个Actor中的业务逻辑非常复杂,为了降低代码的复杂度,可以将其拆分成多个子任务(在一个actor的内部可以创建一个或多个actor,actor的创建者也是该actor的监控者) 

一个ActorSystem应该被正确规划,例如哪一个Actor负责监控,监控什么等等:

  •             负责分发的actor管理接受任务的actor
  •             拥有重要数据的actor,找出所有可能丢失数据的子actor,并且处理他们的错误。
(3)AactorPath

ActorPath是通过字符串描述Actor的层级关系,并唯一标识一个Actor的方法。

ActorPath包含协议,位置 和 Actor层级关系

//本地path
"akka://my-sys/user/service-a/worker1"   

//远程path  akka.tcp://(ActorSystem的名称)@(远程地址的IP):(远程地址的端口)/user/(Actor的名称)
"akka.tcp://my-sys@host.example.com:5678/user/service-b" 

//akka集群
"cluster://my-cluster/service-c"
远程地址不清楚是多少的话,可以在远程的服务启动的时候查看


(4)获取Actor Reference

获取Actor引用的方式有两种:创建 和 查找。 

要创建Actor,可以调用ActorSystem.actorOf(..),它创建的actor在guardian actor之下,接着可以调用ActorContext的actorOf(…) 在刚才创建的Actor内生成一个actor树。这些方法会返回新创建的actor的引用,每一个actor都可以通过访问ActorContext来获得自己(self),子Actor(children,child)和父actor(parent)。

要查找Actor Reference,可以调用ActorSystem或ActorContext的actorSelection(“path”),在查找ActorRef时,可以使用相对路径或绝对路径,如果是相对路径,可以用 .. 来表示parent actor。

actorOf / actorSelection / actorFor的区别

  • actorOf 创建一个新的actor,创建的actor为调用该方法所属的context的直接子actor。
  • actorSelection 查找现有actor,并不会创建新的actor。
  • actorFor 查找现有actor,不创建新的actor,已过时。
(5)Actor和ActorSystem

Actor:

就是用来做消息传递的

用来接收和发送消息的,一个actor就相当于是一个老师或者是学生。

如果我们想要多个老师,或者学生,就需要创建多个actor实例。

ActorSystem:

用来创建和管理actor,并且还需要监控Actor。ActorSystem是单例的(object)

在同一个进程里面,只需要一个ActorSystem就可以了

三、Actor的示例

Scala:Akka实现简单RPC通信:https://blog.csdn.net/qq_41851454/article/details/80011016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值