gpt4 book ai didi

scala - 将多个 future 与多个远程参与者一起使用时,程序会挂起

转载 作者:行者123 更新时间:2023-12-04 21:25:50 28 4
gpt4 key购买 nike

我在一台主机上启动了两个远程 actor,它们只回显发送给他们的任何内容。然后我创建另一个 Actor ,它向两个 Actor 发送一些消息(使用 !! ),并保留一个包含这些 Actor 的回复的 Future 对象列表。然后我遍历这个 List 获取每个 Future 的结果。问题是大多数时候一些 future 永远不会返回,即使 Actor 声称它已经发送了回复。问题是随机发生的,有时它会通过整个列表,但大多数时候它会卡在某个点并无限期挂起。

这是一些在我的机器上产生问题的代码:

sink.scala:

import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.Exit
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._

object Sink {
def main(args: Array[String]): Unit = {
new RemoteSink("node03-0",43001).start()
new RemoteSink("node03-1",43001).start()
}
}
class RemoteSink(name: String, port: Int) extends Actor
{
def act() {
println(name+" starts")
trapExit=true
alive(port)
register(Symbol(name),self)

loop {
react {
case Exit(from,reason) =>{
exit()
}
case msg => reply{
println(name+" sending reply to: "+msg)
msg+" back at you from "+name
}
}
}
}
}

源.scala:
import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.remote.Node;
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._

object Source {
def main(args: Array[String]):Unit = {
val peer = Node("127.0.0.1", 43001)
val source = new RemoteSource(peer)
source.start()
}
}
class RemoteSource(peer: Node) extends Actor
{
def act() {
trapExit=true
alive(43001)
register(Symbol("source"),self)

val sinks = List(select(peer,Symbol("node03-0"))
,select(peer,Symbol("node03-1"))
)
sinks.foreach(link)

val futures = for(sink <- sinks; i <- 0 to 20) yield sink !! "hello "+i
futures.foreach( f => println(f()))

exit()
}
}

我究竟做错了什么?

最佳答案

我猜你的问题是由于这一行:

futures.foreach( f => println(f()))

在其中您遍历所有 future 并依次阻止每个 future ,等待其结果。阻止 future 通常是一个坏主意,应该避免。你想要做的是指定当 future 的结果可用时要执行的操作。尝试这个:
futures.foreach(f => f.foreach(r => println(r)))

这里有另一种表达方式,用于理解:
for (future <- futures; result <- future) { println(result) }

This blog entry是关于阻止 future 的问题以及 monadic future 如何克服它的优秀入门读物。

关于scala - 将多个 future 与多个远程参与者一起使用时,程序会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356823/

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