2016-12-20 17 views
0

我在Scala中使用akka演员。我想知道是否有办法让演员在处理收到的消息时可以定期检查其邮箱中的其他消息,并在此消息后可以更改其变量。如何定期检查演员邮箱并更改scala中的变量

如A方案:

class Actor1 (constructors){ 

    def receive={ 
     case "go" => run()  //the actor starts 
     case "alter variables" // a new message is stashed in mailbox 
    } 

    def run={ 
     //do stuff 
     check(mailbox) //while the porocessing of the "go" message 
        // is not finished 
     if ("alter variables" in mailbox) { 
      change a variable value 
     } 
    } 

}

+0

我不知道你为什么想这样做,但我认为这会打破Akka试图强制执行的设计模式,所以我不鼓励这样做。通过实现你自己的队列,你可以通过实现自己的队列来安装类似的东西,并且有一些其他的机制来检查队列。 – childofsoong

+0

这是不可能的。参与者一次处理*一条消息*。这是他们如何保证并发环境中安全的可变状态。 – Ryan

回答

0

没有说你不能移动长时间运行的任务分解成不同的线程,使用未来,一个演员里面。您的演员会继续回复邮箱中的邮件,而另一个线程则会处理您的邮件。您可以设置未来的回调,并让任务正常完成。

+0

请注意,从回调中修改actor的状态是非常非常非常危险的,应该永远不要做。 – Ryan

+0

我不想使用期货,因为我已经尝试了它们,结果我目前写的代码比单核版本慢。我想随时访问我的邮箱,或者访问同一系统中两个不同角色的变量。 – Noowada

+0

@ user1834705这是不可能的。 – Ryan