Actor系列总结

一、Actor

1.Actor模型

Actor模型是一个并发编程的数学模型。当接收到一个消息后,actor可以做出以下反应:做出本地决策,创造更多actor,发送更多消息,并且决定如何对下一条消息做出反应。Actor可以改变自己的状态,但是只能通过消息传递来影响其他actor(避免了锁的使用,实际场景中锁是一个相当烦的东西)。

2.生命周期

Actor 交给开发者的是一个引用,这个引用包括 path和UID,即可定位一个 Actor 也可定位多个Actor

preStart() 在 actor 启动后,处理第一条消息之前被调用。

postStop() 在 actor 停止之前调用,调用后不再接收消息。

preRestart() 在重启 Actor 之前在旧实例上调用

postRestart() 在重启 Actor 之后在新实例上调用,Actor.scala默认的postRestart()方法调用了preStart()方法

:当进行 restart 时,在 MyWork 中打印了uid和path,以及 Object 的 hash 值。

Resume: 当 resume 时,只有 preStart 被调用。

Stop: 节点 Stop 时,会先调用其所有子 actor 的 postStop() 方法。

3.props()

静态方法 props() 用来构造这个 Actor 的实例

Props.create(PongActor.class, arg1, arg2, argn);

4.onReceive(Object msg)

onReceive(Object msg)方法是 Actor 的核心逻辑,Actor 接收到的消息都放在 MailBox 中,从这个 MailBox 中取出来的一条一条消息就通过这个方法进行处理。可以对不同消息定义不同的动作。

5.Actor 实例的引用叫做ActorRef

val pongy = actorSystem.actorOf(Props[PongyActor], “pongy”)

6.watch系列

(1)一个 Actor a 可以监控另一个 Actor b,当b被 context stop 或被 PoisonPill 毒死后,a 会收到一个 Terminated 信号。

有两种 watch 方式:第一种是 watch 一个独立的 Actor,第二种是 watch 子Actor

(2)这里需要注意,虽然父Actor享有对子Actor的一切生杀大权,但是 需要在父Actor中显示的调 getContext.watch(childActorRef) ,才会当子Actor停止运行后收到Terminated消息。

7.剖析Actor

(1)AbstractActor:首先,我们继承了AbstractActor

(2)Receive:AbstractActor 类有一个receive 方法,其子类必须实现这个方法或是通过构造函数调用该方法。receive 方法返回的类型是PartialFunction。

Akka 为我们提供了一个抽象的构造方法类receiveBuilder,用于生成PartialFunction 作为返回值。

(3)receiveBuilder:连续调用receiveBuilder 的方法,为所有需要匹配处理的输入消息类型提供响应方法的描述, 然后调用build() 方法生成需要返回的PartialFunction

(4)Match:receiveBuilder 提供了一些值得一提的match 方法,我们将提供一些示例,展示如何分别使用这些方法来匹配“ping”消息。

(4.1)match(class, function):描述了对于任何尚未匹配的该类型的示例,应该如何响应。

match(String.class, s -> {if(s.equals(“Ping”)) respondToPing(s);})

(4.2)match(class, predicate, function):描述了对于predicate 条件函数为真的某特定类型的消息,应该如何响应。

match(String.class, s -> s.equals(“Ping”), s -> respondToPing(s))

(4.3)matchEquals(object, function):描述了对于和传入的第一个参数相等的消息,应该如何响应。

matchEquals(“Ping”, s -> respondToPing(s))

(4.4) matchAny(function):该函数匹配所有尚未匹配的消息。通常来说,最佳实践是返回错误信息,或者至少将错误信息记录到日志,帮助开发过程中的错误调试。

8.有4种核心的Actor消息模式:tell、ask、forward和pipe

Ask:向Actor 发送一条消息,返回一个Future。当Actor 返回响应时,会完成

Future。不会向消息发送者的邮箱返回任何消息。

Tell: 向Actor 发送一条消息。所有发送至sender()的响应都会返回给发送消息的Actor。

Forward:将接收到的消息再发送给另一个Actor。所有发送至sender()的响应都会返回给原始消息的发送者。

Pipe:用于将Future 的结果返回给sender()或另一个Actor。如果正在使用Ask或是处理一个Future,那么使用Pipe 可以正确地返回Future 的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A2C(Advantage Actor-Critic)算法是一种常用的强化学习算法,旨在通过同时训练一个策略网络(Actor)和一个价值网络(Critic)来实现优化。 在A2C算法中,Actor网络用于学习动作策略,而Critic网络用于评估状态的价值。Actor网络根据当前状态选择一个动作,并生成一个策略分布。Critic网络根据当前状态估计该状态的价值。这两个网络共同工作,通过优化目标函数来提高策略和价值的准确性。 A2C算法的训练过程可以分为两个步骤:生成样本和更新参数。生成样本时,Actor网络根据当前状态生成动作,并与环境进行交互,得到下一个状态和奖励。然后,使用这些样本计算出优势函数,即当前状态的动作价值与预期价值之间的差异。 更新参数时,使用生成的样本来计算Actor和Critic网络的损失函数。Actor损失函数一般使用策略梯度方法,通过最大化优势函数来更新策略网络的参数。Critic损失函数一般使用均方误差损失,通过最小化实际价值与预期价值之间的差异来更新价值网络的参数。这两个网络的参数可以使用梯度下降法进行更新。 与A3C(Asynchronous Advantage Actor-Critic)算法不同,A2C算法是一种1-step方法,即每次更新只考虑当前的状态和动作。而A3C算法是一种n-step方法,考虑了未来多个状态和动作的影响。因此,A3C相比于A2C在更新参数的方式上有所不同,但都是基于Actor-Critic的思想。 总结来说,A2C算法是一种结合了Actor和Critic网络的强化学习算法,通过不断生成样本和更新网络参数来提高策略和价值的准确性。它是一种1-step方法,与A3C算法相比,在更新参数的方式上有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [强化学习算法:AC系列详解](https://blog.csdn.net/qq_29176963/article/details/104975905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值