gpt4 book ai didi

scala - 我如何让 Scala Actor 报告任务完成情况?

转载 作者:行者123 更新时间:2023-12-04 05:52:18 26 4
gpt4 key购买 nike

我需要将一系列远程调用切成块。我想过使用 Actor 。

我想到了这样的事情:

class ControlActor() extends Actor{
var counter = 1000
def act{
for (i <- 1 until 1000) { new RequestActor(this) start }
while(true){
receive{
case "Stop" =>{counter = counter-1; if(counter==0){return}}
}
}
}
}

class RequestActor(parent:ControlActor) extends actor{ ... }

但这有一个明显的问题:当我进入 recieve 块时,一些 RequestActor 实例可能已经执行完毕。如果他们向尚未处于消息接收状态的参与者发送消息,会发生什么?消息是排队还是被丢弃?

最重要: 我如何创建能够通知创建它们的actor的子actor,即使它们返回得非常快?

还相关:将当前 Actor 实例( this )传递给其他 Actor 是一个好习惯吗?出于某种原因,我没有看到有人这样做。

最佳答案

你很好; Actor 中未处理的消息将简单地进入邮箱并在 Actor 准备好接收它们时进行处理。但是,关于 Actor 回复他们的来电者,您通常不需要传递对 this 的引用。 ,因为 Actor 可以通过 reply 直接与他们的调用者沟通.这是一个简单的例子:

class MyActor(n: Int) extends Actor {
def act() {
loop {
react {
case m: Int => reply(n + m) // Use `reply` to reply to caller
}
}
}
}

// new MyActor(0), new MyActor(10), new MyActor(20), ...
val actors = (0 to 100 by 10) map (new MyActor(_).start())

// Message each actor with '5', expecting a response (that's what `!?` does)
val responses = actors map (_ !? 5)
responses foreach println

结果是
5
15
25
35
45
55
65
75
85
95
105
!?然而,操作符将阻塞主线程,直到我们得到对其消息的回复。结果, actors map (_ !? 5)实际上并不是所有的并发。相反,您可以使用 !!生成 future (您可以在此期间计算并推迟评估,直到您准备好)。所以......将最后两行更改为
val futures = actors map (_ !! 5)
futures foreach (future => println(future()))

将给第一个 Actor 发消息“5”,给我一个在此期间坚持的 future ,然后给第二个 Actor 发消息“5”,给我一个在此期间坚持的 future ,等等,并且,当我们准备好了,我们可以评估 future ( future() )并以某种方式使用它的结果(比如打印出来)。

关于scala - 我如何让 Scala Actor 报告任务完成情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9936143/

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