【问题标题】:How to set Akka actors run only for specific time period?如何设置 Akka 演员仅在特定时间段内运行?
【发布时间】:2014-12-17 10:09:46
【问题描述】:

我有一个大任务,我把它分解成更小的任务并分析它们。我有一个基本模型。

主人、工人和听众。

大师创建任务,将它们交给工人演员。一旦工人演员完成,它会向主人提出另一项任务。一旦所有任务完成,他们就会通知听众。他们通常需要不到 2 分钟的时间来完成 1000 个任务。

现在,某些任务所花费的时间可能比其他任务要多。 我想为每个任务设置计时器,如果一个任务需要更多时间,那么工作任务应该被主人中止,并且必须稍后重新提交任务作为新任务。如何实现?我可以计算一个工人任务所花费的时间,但是主演员如何实时掌握所有工人演员所花费的时间?

【问题讨论】:

    标签: scala akka actor


    【解决方案1】:

    处理此问题的一种方法是,每个工作人员在收到要开始的任务后,在更改状态以处理任务之前设置超时,例如:

      context.setReceiveTimeout(5 minutes)  // for the '5 minutes' notation - import scala.concurrent.duration._
    

    如果收到超时,worker 可以中止任务(或您认为合适的任何其他操作 - 例如,杀死自己,或将通知消息传递回 master)。如果任务完成等不要忘记取消超时(设置持续时间= Duration.Undefined)。

    【讨论】:

    • 只有当工人自己不做工作时,这才是一个可行的选择;基本上是执行工作的另一个参与者的轻量级代理。这样,所有这些工作人员都会向其他参与者发出工作请求,然后将状态切换为等待响应(使用setReceiveTimeout 在一定时间内处理无响应)。如果 worker 本身正在执行某种同步工作,那么您不能真正以您描述的方式中断它,并且您将不得不管理来自 master 的超时。
    • 啊,是的——你说得对@cmbaxter。我的回答是基于我熟悉的使用这个想法的演员,实际上这些演员正在通过协调对其他演员的调用来处理他们的任务。尽管如此,让每个“工作人员”成为执行实际(同步)工作的子角色的一种包装器可能是可行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多