设为首页 加入收藏

TOP

Akka(6): become/unbecome:运算行为切换(一)
2017-10-09 14:06:33 】 浏览:5768
Tags:Akka become/unbecome 运算 行为 切换

   通过一段时间的学习了解,加深了一些对Akka的认识,特别是对于Akka在实际编程中的用途方面。我的想法,或者我希望利用Akka来达到的目的是这样的:作为传统方式编程的老兵,我们已经习惯了直线流程方式一口气实现完整的功能。如果使用Akka,我们可以把这个完整的功能分切成多个能产生中间临时结果的小功能然后把这些功能放到不同的Actor上分别独立运算,再通过消息来连接这些功能集合成最终结果。如此我们就轻易得到了一个多线程并发程序。由于Akka是软件工具(Tool),没有软件架构(Framework)对编程方式的特别要求,Actor的构建和使用非常方便,我们甚至不需要多少修改就可以直接把原来的一段代码移到Actor上。如果遇到一些重复的运算,我们还可以用Routing来实现并行运算。当然,把Actor当作简单的行令运算器可能还不够,如果能实现一些具体运算之上的高层次程序逻辑和流程就更加完善。我们可以用这样的高层次Actor去解析程序逻辑、执行流程、把具体的运算分配给其它各种运算Actor或者一组Routees并行运算从而取得整体程序的高效率运行。具备了这些功能后,也许我们就可以完全用Actor模式来替代传统单线程行令编程了。Akka可以通过Actor的动态行为转换来实现同一Actor在不同情况下提供不同的功能支持。我们前面提到Actor的功能是在receive函数内实现的。那么转换功能是否就是切换不同的receive函数呢?答案是确定的,Akka是通过Actor的context.become(rcvFunc)来实现receive函数切换的,我们看看下面这个示范:

import akka.actor._ object FillSeasons { case object HowYouFeel def props = Props(new FillSeasons) } class FillSeasons extends Actor with ActorLogging { import FillSeasons._ override def receive: Receive = spring def Winter: Receive = { case HowYouFeel => log.info("It's freezing cold!") } def summer: Receive = { case HowYouFeel => log.info("It's hot hot hot!") } def spring: Receive = { case HowYouFeel => log.info("It feels so goooood!") } } object Becoming extends App { val demoSystem = ActorSystem("demoSystem") val feelingsActor = demoSystem.actorOf(FillSeasons.props,"feelings") feelingsActor ! FillSeasons.HowYouFeel }

在FeelingsActor里我们定义了三个receive函数,对共同的HowYouFeel消息采取了不同的反应。默认行为是spring。那么应该如何在三种行为中切换呢?用context.become(???),如下:

import akka.actor._ object FillSeasons { case object HowYouFeel case object ToSummer case object ToSpring case object ToWinter def props = Props(new FillSeasons) } class FillSeasons extends Actor with ActorLogging { import FillSeasons._ override def receive: Receive = spring def winter: Receive = { case HowYouFeel => log.info("It's freezing cold!") case ToSummer => context.become(summer) case ToSpring => context.become(spring) } def summer: Receive = { case HowYouFeel => log.info("It's hot hot hot!") case ToSpring => context.become(spring) case ToWinter => context.become(winter) } def spring: Receive = { case HowYouFeel => log.info("It feels so goooood!") case ToSummer => context.become(summer) case ToWinter => context.become(winter) } } object Becoming extends App { val demoSystem = ActorSystem("demoSystem") val feelingsActor = demoSystem.actorOf(FillSeasons.props,"feelings") feelingsActor ! FillSeasons.HowYouFeel feelingsActor ! FillSeasons.ToSummer feelingsActor ! FillSeasons.HowYouFeel feelingsActor ! FillSeasons.ToWinter feelingsActor ! FillSeasons.HowYouFeel feelingsActor ! FillSeasons.ToSpring feelingsActor ! FillSeasons.HowYouFeel scala.io.StdIn.readLine() demoSystem.terminate() }

我们增加了三个消息来切换receive。运算结果如下:

[INFO] [06/08/2017 17:51:46.013] [demoSystem-akka.actor.default-dispatcher-3] [akka://demoSystem/user/feelings] It feels so goooood!
[INFO] [06/08/2017 17:51:46.019] [demoSystem-akka.actor.default-dispatcher-4] [akka://demoSystem/user/feelings] It's hot hot hot!
[INFO] [06/08/2017 17:51:46.028] [demoSystem-akka.actor.default-dispatcher-4] [akka://demoSystem/user/feelings] It's freezing cold!
[INFO] [06/08/2017 17:51:46.028] [d
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Akka(3): Actor监管 - 细述Bac.. 下一篇Akka(7): FSM:通过状态变化来..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目