次の問題を解決する方法を理解できません:私はそれらを受け取ったときに何らかの方法でタスクを実行する少数の俳優(労働者)を持っています。メインの俳優(監督)がこのプロセスをコントロールし、仕事を止めるための仕事を受け取ることができます。この場合、主役は新しい仕事の作成をやめ、従業員が既存の仕事をすべて終えるのを待ってから、主人だけが退場するようにしなければなりません。この問題を解決するには終了する前に子どものすべての仕事を完了するのを待つ俳優
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
}
を。 「ワーカー」特性にカウンターを持つもう1つの変種は、ワーカーがメッセージを受け取ったときにインクリメントし、応答したときにデクリメントすることです。 「フォアマン」の
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
になります。
いいえ、労働者はシャットダウンを決めることができません、フォアマンはします。 – Jeriho
これは、提案されたものではありません。労働者は、フォアマンへの言及を持っており、すべてが完了したときにメッセージを送信します。フォアマンは、このメッセージを受け取った労働者を追跡し、適切な時期にシャットダウンします。 – Janx
Janxは私よりも優れていると思う。 – pr1001