scala – 在akka演员的消息传递序列
我对Akka很新,在参考手册中找不到答案.
假设我们在3台机器(A,B,C)的集群中分配了远程执行器,其中一个演员居住在每台机器上,而另一个演员则具有actorRef到另外2个机器,即: Machine A: A (real actor) -> B (ref) -> C (ref) Machine B: -> A (ref) B (real actor) -> C (ref) Machine C: -> A (ref) -> B (ref) C (real actor) 演员A执行以下代码: bRef ! msg1 bRef ! msg2 演员B在消息处理程序中执行以下代码: case msg1 => cRef ! msg3 aRef ! msg4 演员C执行消息处理程序中的以下代码: case msg3 => aRef ! msg5 我可以做出以下假设(如果有): > actor B在获取msg2之前得到msg1 后续问题可能导致以上理解: bRef ! msg1 阻止直到actor B在其邮箱中获取消息,或者它产生处理传递并继续执行的线程 bRef ! msg2 之前它甚至知道演员B得到了msg1? 解决方法
对于(1)您有保证msg2将在msg2之前被调度员排队.实际发生的事情真的取决于您使用哪个调度程序:
http://akka.io/docs/akka/1.1.2/scala/dispatchers.html,但在您的情况下,只要B可以接受两个消息,那么它将始终在msg2之前收到msg1.
对于(2),不,你没有这个保证.的!只要调度员将消息排入队列,当消息被目标actor的邮箱接受时,该方法就会返回.然后发送在另一个线程中完成,并受到各种竞争条件的约束.
您可以使用带有本地actor的BoundedMailbox来显示向调度程序发送的消息与…异步: class TestActor extends Actor { val mailboxCapacity = BoundedMailbox(capacity = 1) self.dispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher("test",1,mailboxCapacity).build def receive = { case x: String => Thread.sleep(1000) println("Received message") case _ => } } val t = Actor.actorOf[TestActor] t.start() t ! "one"; t ! "two"; t ! "three"; println("Main thread"); 打印: scala> t ! "one"; t ! "two"; t ! "three"; println("Main thread"); Received message Main thread scala> Received message Received message 这意味着主线程中的代码执行在你甚至知道消息是否将被传递之前继续.在这种情况下,如果我们在调度程序上设置了一个pushTimeout并使Thread.sleep等待超过超时时间,那么发送的消息可能很容易超时. 比较这个使用!!: scala> t !! "one"; t !! "two"; t !! "three"; println("test"); Received message Received message Received message test 所以,考虑到这一点.实现(2)的方式是: case msg1 => cRef !! msg3 aRef ! msg4 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |