Je démarre deux acteurs distants sur un hôte qui fait écho à tout ce qui leur est envoyé. Je crée ensuite un autre acteur qui envoie un certain nombre de messages (en utilisant !!) aux deux acteurs et garde un objet List of Future contenant les réponses de ces acteurs. Ensuite, je boucle sur cette liste pour aller chercher le résultat de chaque futur. Le problème est que la plupart du temps, certains futurs ne reviennent jamais, même si l'acteur prétend avoir envoyé la réponse. Le problème se produit de manière aléatoire, parfois il traverse toute la liste, mais la plupart du temps, il se bloque à un moment donné et se bloque indéfiniment.programme se bloque lors de l'utilisation de plusieurs futurs avec plusieurs acteurs à distance
Voici un code qui produit le problème sur ma machine:
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
}
}
}
}
}
Source.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()
}
}
Qu'est-ce que je fais mal?
J'ai également essayé d'utiliser un port différent pour chaque acteur, mais obtenir le même résultat. – Kevin