gpt4 book ai didi

scala - 在退出前等待完成所有 child 工作的 Actor

转载 作者:行者123 更新时间:2023-12-01 09:11:14 25 4
gpt4 key购买 nike

无法弄清楚如何解决以下问题:我有几个 Actor ( worker )在收到(我的意思是 react )任务时以某种方式执行任务。主要参与者(工头)控制此过程,并可以接收任务以停止工作。在这种情况下,主要参与者必须停止创建新任务并等待工作人员完成所有现有任务,然后主要参与者才应该退出。

import actors.Actor
import actors.Actor._

class Foreman extends Actor{
val workerA = new WorkerA
val workerB = new WorkerB
val workerC = new WorkerC
self.link(workerA)
self.link(workerB)
self.link(workerC)
def act{
workerA.start
workerB.start
workerC.start

// adding tasks to workers somehow
//...
loop{
case ResultOfTask(res) => //...
case Stop => //workers mustn't immediately stop but must finish their tasks and then exit
case ProductionAccident => //...
}


}
}

case class Task(activity:String)
case class ResultOfTask(result:String)

trait Worker extends Actor{

def act{
loop{
react{
case Task(activity) => sender ! processTask(activity)
}
}
}

def processTask(activity:String):ResultOfTask
}

为了解决这个问题,我写了下面的代码:

def condition = workerA.getState!=State.Suspended  && workerB.getState!=State.Suspended && workerC.getState!=State.Suspended && mailboxSize == 0
case Stop => {
if(condition) exit("sweet dreams") else continue
}

检查主角是否应该退出。另一个在“Worker”特征中有 counder 的变体,当 worker 收到消息时递增它,并在它响应时递减。

trait Worker extends Actor {
private var count = 0
def act {
loop{
react{
case Task(activity) => {
count += 1
sender ! processTask(activity)
count -= 1
}
}
}
}
def hasDoneAllTasks = count == 0

def processTask(activity: String): ResultOfTask
}

“工头”中的“条件”功能将是

def condition = workerA.hasDoneAllTasks   && workerB.hasDoneAllTasks  && workerC.hasDoneAllTasks  && mailboxSize == 0

我希望有更好的解决方案,你会提出它们。

最佳答案

如果工头总是期待 worker 的回答,那么解决方案很简单:工头维护一个计数器,每次发送一条消息时它都会递增它,每次它从 worker 那里收到一条消息时它就会递减它。任何时候计数器为零,它都可以自行停止(假设没有其他人向工作人员发送消息)。

如果工头并不总是期待 worker 的回答,您可以通过无内容消息来实现这一点

case object Done { }

并让工作人员在完成后回复。然后,参见上文。

如果工头不是唯一与 worker 交谈的人,或者您希望在后台少说话,那么工头和 worker 将不得不协商。工头可以送

case object RequestStop { }

工作人员将做一些优雅的事情,并在完成后回复 Done。当工头收到与它发送的 RequestStop 一样多的 Done 消息时,它可以自由退出。

关于scala - 在退出前等待完成所有 child 工作的 Actor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4945609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com