【问题标题】:How to periodically check an actor mailbox and alter variables in scala如何定期检查演员邮箱并更改scala中的变量
【发布时间】:2017-05-05 23:26:15
【问题描述】:

我在 Scala 中使用 akka 演员。我想知道是否有办法让演员在处理收到的消息时可以定期检查其邮箱中是否有其他消息,并且跟随这些消息可以改变其变量。

类似的方案:

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
       }
    }

}

【问题讨论】:

  • 我不知道你为什么要这样做,但我认为它会破坏 Akka 试图强制执行的设计模式,所以我不鼓励这样做。您可以通过实现自己的队列来放置消息,并使用其他一些机制来检查该队列,从而构建类似的东西。
  • 这是不可能的。参与者一次处理一条消息。这就是它们在并发环境中保证安全可变状态的方式。

标签: scala akka actor


【解决方案1】:

没有什么说你不能在actor内部使用Future将长时间运行的任务移动到不同的线程中。您的演员将继续响应邮箱中的消息,而另一个线程会继续处理您的处理。您可以设置将来的回调,让任务正常完成。

【讨论】:

  • 请注意,从回调中修改演员的状态是非常非常危险的,不应该这样做。
  • 我不想使用 Futures,因为我已经尝试过它们,因此我当前编写的代码比其单核版本慢。我想随时访问我的邮箱或访问同一系统中两个不同参与者的变量。
  • @user1834705 这是不可能的。
猜你喜欢
  • 2015-03-03
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多