通过一段时间的学习了解,加深了一些对Akka的认识,特别是对于Akka在实际编程中的用途方面。...具备了这些功能后,也许我们就可以完全用Actor模式来替代传统单线程行令编程了。Akka可以通过Actor的动态行为转换来实现同一Actor在不同情况下提供不同的功能支持。...我们前面提到Actor的功能是在receive函数内实现的。那么转换功能是否就是切换不同的receive函数呢?...FillSeasons.HowYouFeel } 在FeelingsActor里我们定义了三个receive函数,对共同的HowYouFeel消息采取了不同的反应。默认行为是spring。...可以理解,所有connected状态之前的任何操作都不会真正生效。Akka提供了个Stash trait能把一个receive函数未处理的消息都存起来。
如果 Actor 在部署中配置了不同的邮箱,可以直接配置,也可以通过具有指定邮箱类型的调度器(dispatcher)配置,那么这将覆盖此映射。...中的java.util.PriorityQueue提供支持 优先级相同的邮件的传递顺序未定义,与BoundedStablePriorityMailbox相反 是否阻塞:如果与非零mailbox-push-timeout-time...注释:请确保包含一个采用akka.actor.ActorSystem.Settings和com.typesafe.config.Config参数的构造函数,因为此构造函数是通过反射调用来构造邮箱类型的。...在幕后,构建了一种空的 Actor 引用,将其发送给系统的守护者 Actor,该 Actor 实际上创建了 Actor 及其上下文,并将其放入引用中。...在这之前,发送到ActorRef的消息将在本地排队,只有在交换真正的填充之后,它们才会被传输到真正的邮箱中。
分布式系统:Akka 提供了构建分布式系统的支持。您可以将 Actor 部署在不同的节点上,这些节点可以是物理机器或虚拟机。...它提供了监督策略,允许在 Actor 发生故障时采取自定义的恢复操作。这有助于系统在故障时继续运行,提高了系统的可用性。...对共享内存在现代计算机架构上的误解 在多核CPU架构中,多线程之间不再有真正的共享内存,而是通过Cache行传递数据,使得共享变量的内存可见性成为问题。...Actor保持了封装性,因为消息的处理是串行的,不需要使用锁来同步多线程访问。 Actor的状态是本地的,不共享,通过消息传递数据,符合现代系统中内存工作方式。...监督程序可以决定是否重新启动子Actor或停止子Actor,确保系统的可恢复性和健壮性。 ---- 小结 总的来说,Akka 是一个强大的框架,适用于构建高度并发、分布式、可伸缩和容错性强的应用程序。
详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法 在Libgdx的使用过程中,经常会用到ScrollPane这个widget,来实现滑动效果, 如下所示: ?...但是如果想在上面的效果上添加一点扩展,比如ScrollPane中的Actor可以从ScrollPane中移出来,并添加到Stage中,则需要添加额外的逻辑 具体代码参考如下: /** * Created...inStage) { Vector2 vector2 = actor.localToStageCoordinates(new Vector2()); actor.setPosition(vector2....x, vector2.y); stage.addActor(actor); stage.cancelTouchFocusExcept(this, actor); inStage = true; } }...如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
消息应该是不可变的,因为它们在不同的线程之间共享。 将 Actor 的关联消息作为静态类放在 Actor 的类中是一个很好的实践,这使得理解 Actor 期望和处理的消息类型更加容易。...receiveBuilder定义了行为;Actor 应该如何响应它接收到的不同消息。Actor 可以有状态。访问或改变 Actor 的内部状态是线程安全的,因为它受 Actor 模型的保护。...在分布式系统中,这种间接创建实例的方法增加了很多好处和灵活性。 在 Akka 中位置无关紧要。...这就启用了故障管理的“让它崩溃(let it crash)”模型,在该模型中,系统可以通过销毁有问题的 Actor 和重新启动健康的 Actor 来自我修复。...注意:在本例中,Greeter Actor 都使用了相同的 Printer 实例,但我们可以创建多个 Printer Actor 实例。
尤其是 Akka 作为一个功能复杂的重量级框架,并且在 Typed Akka 中做出了限制公开的直接沟通两个 Actor 的能力,强制要求使用 Akka Cluster 的决定。...Spark 的 RPC 实现主要位于 core 模块下的 org.apache.spark.rpc 这个包下,阅读代码的过程中通过跳转到定义和查找使用点可以找到完整的脉络。...通常来说,由于 Actor Model 中的 Actor 是单线程的处理消息的,你在同一个消息处理过程中多次调用 sender() 返回的都是当前消息的来源。...从熟悉的变成模型出发,可以把 ask 当成返回值不为 void 的函数或者 Pascal 中的 function,send 当成返回值为 void 的函数或者 Pascal 中的 procedure。...,首先看你发布到 Dispatcher 的作业是否被分派到 MainThreadExecutor 那个线程上。
Actor不单可以在当前JVM中运行,也可以跨JVM在任何机器上运行,这基本上就是Akka程序实现分布式运算的关键了。...Actor是Akka系统中的最小运算单元。每个Actor只容许单一线程,这样来说Actor就是一种更细小单位的线程。Akka的编程模式和其内置的线程管理功能使用户能比较自然地实现多线程并发编程。...Actor的主要功能就是在单一线程里运算维护它的内部状态,那么它的内部状态肯定是可变的(mutable state),但因为每个Actor都是独立的单一线程运算单元,加上运算是消息驱动的(message-driven...Actor的内部状态(internal state)与函数式编程不可变集合(immutable collection)的元素差不多,都是包嵌在一个类型内,即F[A] >>> Actor[A]从类型款式来讲很相像...我们可以把Actor视作不纯函数(impure function),对同样的输入可能会产生不同的输出结果,如此就无法把对Actor的编程归类为函数式编程了,但Actor编程的确是一种有别于其它编程模式、
由于消息驱动式的程序是松散耦合的,每项功能都是在独立的线程中运算,互不干扰依赖,所以我们可以很自然的分开来实现各项功能以及独立测试每项功能。...receive函数所调用的功能函数可以是任何JVM兼容语言函数,由于每个Actor的运算都在自己独立的线程里进行,所以我们不必担心Actor函数在运行中的交叉调用问题。...Akka程序本就是一种原生的多线程程序,每个Actor都在一个自己的线程内独立运算它的receive函数。...而这个问题在Akka编程中得到了完美的解决。在Akka编程里我们可以把每段可能产生异常的代码放到一个独立的Actor中去运算。Akka的Actor组织是一个层级结构。...父级Actor通过递归方式先停止下面的子孙Actor,那么在启动过程中这些停止的子孙Actor是否会自动构建呢?
安装完成之后,在IDEA中安装sbt插件,然后选择创建SBT项目,与普通Scala语言最主要的不同是会创建一个build.sbt文件,这个文件主要记录的就是项目的依赖等,要添加依赖就可以添加如下两行代码...是一个偏函数,用于接收并处理其他Actor发送的消息,这里就用到了模式匹配,可以根据不同的消息类型进行不同的处理,相当于路由。...Math.PI 24 } 上面的代码定义了两个Actor对象actor_a,actor_b,采用此种方式Actor会自动start,然后在主线程中各向每个Actor发送了一条信息,Actor...用于管理Actor,第二句就是在system中创建一个上面MyActor实例。...通过打印actor.path可以得到akka://akkatest/user/akkaactor,可以看出该Actor确实是在system之下,其中user表示是用户自定义Actor。
,这样让用户在不知不觉中自然的实现了多线程并发软件编程(concurrent programming)。...从这个案例中我的结论是尽量把Akka Actor使用在需要维护内部状态的应用中。如果为了实现non-blocking只需要把程序分布到不同的线程里运行的话就应该直接用Future,这样自然的多。...每一个Actor在结构中都可以用一个路径(ActorPath)来代表它在系统结构里的位置。我们可以重复用这个路径来构建Actor,但每次构建都会产生新的ActorRef。...所以这些函数的功能就代表着Actor的行为模式。Actor的运算行为可以通过become来替换默认的receive函数,用unbecome来恢复默认行为。...wallet的定义,必须继承Actor以及override receive函数: class Wallet extends Actor { import Wallet._
---- Actor并发编程 1.Actor介绍 scala的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。...Java并发编程的问题 在Java并发编程中,每个对象都有一个逻辑监视器(monitor),可以用来控制对象的多线程访问。...[NOTE] scala在2.11.x版本中加入了Akka并发编程框架,老版本已经废弃。Actor的编程模型和Akka很像,我们这里学习Actor的目的是为学习Akka做准备。...在scala中,可以使用loop + react来复用线程。...来发送同步消息 在Actor的act方法中,可以使用sender获取发送者的Actor引用 case class Message(id:Int, msg:String) case class ReplyMessage
这种分为内部对象和外部对象的方法可以实现所有所需操作的透明性:在不需要更新其他地方引用的情况下重新启动 Actor,将实际的 Actor 对象放在远程主机上,在完全不同的应用程序中向 Actor 发送消息...好消息是,从概念上讲,Akka 的每个 Actor 都有自己的轻量级线程,这完全与系统的其他部分隔离开来。这意味着,不必使用锁来同步访问,你可以编写 Actor 代码,而不必担心并发性。...在幕后,Akka 将在一组真正的线程上运行一组 Actor,在这些线程中,通常许多 Actor 共享一个线程,随后对一个 Actor 的调用可能最终在不同的线程上进行处理。...行为(Behavior)指的是一个函数,它定义了在该时间点对消息做出反应时要采取的操作,例如,如果客户端被授权,就转发一个请求,否则就拒绝它。...这些更改是通过从行为逻辑(behavior logic)中读取的状态变量中对它们进行编码来实现的,或者函数本身可以在运行时交换出来,请参阅become和unbecome操作。
详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆。...为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可。...ClickListener(){ public void click(){ Gdx.app.log("TAG", "ca is clicked"); } }) stage.add(ca); 上述代码中的...后续调了大半天之后终于弄清楚了原因:虽然在CircleActor的draw方法中通过ShapeRenderer.circle方法将一个圆画到了屏幕上的某一位置,但是此ShapeRenderer其实和Actor...唯一的联系就是以下两句代码, 意思应该是将ShapeRenderer的camera和Actor对象一致。
Actor:Akka是在JVM上的Actor模型的实现。...Reactor vs Proactor模型: Reactor模型: 1 向事件分发器注册事件回调 2 事件发生 3 事件分发器调用之前注册的函数 4 在回调函数中读取数据,对数据进行后续处理 Proactor...模型: 1 向事件分发器注册事件回调 2 事件发生 3 操作系统读取数据,并放入应用缓冲区,然后通知事件分发器 4 事件分发器调用之前注册的函数 5 在回调函数中对数据进行后续处理 以下是Netty中的...Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语"....因此Actor在空间(分布式)和时间(异步驱动)上解耦的。而Akka是Lightbend(前身是Typesafe)公司在JVM上的Actor模型的实现。
Actor是Akka中最核心的概念,它是一个封装了状态和行为的对象,Actor之间可以通过交换信息的方式进行通信,每个Actor都有自己的收件箱(Mailbox)。...通过Actor能够简化锁及线程管理,可以非常容易地开发出正确的并发程序和并行系统,Actor具有如下特性: 提供了一种高级抽象,能够简化在并发(Concurrency)/并行(Parallelism)应用场景下的编程开发...3.重要类介绍 ActorSystem:在Akka中,ActorSystem是一个重量级的结构,他需要分配多个线程,所以在实际应用中,ActorSystem通常是一个单例对象,我们可以使用这个ActorSystem...ActorSystem是一个单例对象 . actor负责通信 4.Actor 在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法。...的引用 //ActorContext全局变量,可以通过在已经存在的actor中,寻找目标actor //调用对应actorSelection方法, // 方法需要一个path路径
一步一步指导迁移到Akka 在这一章中,我们将通过actor迁移的5个步骤。在每一步之后的代码都要为可能的错误进行检测。在前4个步骤中可以一边迁移一个actor和一边测试功能。...在Scala中,控制器的行为主要是在act方法的中定义。逻辑上来说,控制器是一个并发执行act方法的过程,执行完成后过程终止。在Akka中,控制器用一个全局消息处理器来依次处理它的的消息队列中的消息。...在消息处理偏函数中使用react 和 andThen可以使receive的调用模型化。下面是一些简单的例子。...当整个移植完成后,错误处理也可以改由Akka来监管。 修改ACTOR的方法 当我们移除了act方法以后,我们需要替换在Akka中不存在,但是有相似功能的方法。...当所有的主线程和actors结束后,Scala程序会终止。迁移到Akka后,当所有的主线程结束,所有的actor systems关闭后,程序才会结束。
它是Actor Model的一个实现,和Erlang的并发模型很像。在Actor模型中,所有的实体被认为是独立的actors。actors和其他actors通过发送异步消息通信。...另外,每一个actor维护自身单独的状态。一个Actors网络如下所示: ? 每个actor是一个单一的线程,它不断地从其邮箱中poll(拉取)消息,并且连续不断地处理。...这也是我们为什么不该在actor线程里调用可能导致阻塞的“调用”。因为这样的调用可能会阻塞该线程使得他们无法替其他actor处理消息。 2.1....关闭ActorSystem system.terminate(); 在Akka中,创建的每个Actor都有自己的路径,该路径遵循 ActorSystem 的层级结构,大致如下: 本地:akka://sys...); } 在RpcEndpoint中还定义了一些方法如runAsync(Runnable)、callAsync(Callable, Time)方法来执行Rpc调用,值得注意的是在Flink的设计中,对于同一个
Akka 的MessageDispatcher是 Akka Actor “tick”的原因,可以说,它是机器的引擎。...然后你就可以像往常一样创建 Actor,并在部署配置中定义调度器。.../myactor { dispatcher = my-dispatcher } } 部署配置的另一种选择是在代码中定义调度器。...如果在部署配置中定义dispatcher,则将使用此值,而不是以编程方式提供的参数。...注释:配置线程池是一项最适合授权给 Akka 的任务,在application.conf中对其进行配置,并通过ActorSystem进行实例化。
Akka特点: 对并发模型进行了更高的抽象 是异步、非阻塞、高性能的事件驱动编程模型 是轻量级事件处理(1GB内存可容纳百万级别个Actor) 它提供了一种称为Actor的并发模型,其粒度比线程更小,你可以在系统中启用大量的...它提供了一套容错机制,允许在Actor出现异常时进行一些恢复或重置操作。 Akka既可以在单机上构建高并发程序,也可以在网络中构建分布式程序,并提供位置透明的Actor定位服务。...{Actor, ActorSystem, Props} import scala.io.StdIn class HelloActor extends Actor{ // 重写接受消息的偏函数,其功能是接受消息并处理...,即关闭其内部的线程池(ExcutorService) } } } object HelloActor { /** * 创建线程池对象MyFactory,用来创建actor的对象的...通过MyFactory.actorOf方法来创建一个actor,注意,Props方法的第一个参数需要传递我们自定义的HelloActor类, * 第二个参数是给actor起个名字 */
在Props对象的构造过程中,会验证是否存在匹配的构造函数,如果未找到匹配的构造函数或找到多个匹配的构造函数,则会导致IllegalArgumentException。...在重新启动期间,它由postRestart的默认实现调用,这意味着通过重写该方法,你可以选择是否只为此 Actor 或每次重新启动时调用一次此方法中的初始化代码。...建议将消息处理的实际工作委托给方法,而不是在每个lambda中定义具有大量代码的大型ReceiveBuilder。...停机阶段(shutdown phases)的顺序在配置akka.coordinated-shutdown.phases中定义。...通过消息传递初始化 有些情况下,在构造函数中无法传递 Actor 初始化所需的所有信息,例如在存在循环依赖项的情况下。
领取专属 10元无门槛券
手把手带您无忧上云