के साथ एकाधिक वायदा का उपयोग करते समय लटकता है, मैं एक मेजबान पर दो रिमोट एक्टर्स शुरू करता हूं जो उन्हें जो कुछ भी भेजा जाता है उसे गूंजता है। मैं फिर एक और अभिनेता बनाता हूं जो दोनों कलाकारों को कुछ संदेश भेजता है (!! !! !!) और इन कलाकारों के उत्तरों को रखने वाले भविष्य की वस्तुओं की एक सूची रखता है। फिर मैं प्रत्येक भविष्य के परिणाम लाने के लिए इस सूची पर लूप करता हूं। समस्या यह है कि ज्यादातर समय कुछ वायदा कभी वापस नहीं आते हैं, यहां तक कि अभिनेता का दावा है कि उसने जवाब भेजा है। समस्या यादृच्छिक रूप से होती है, कभी-कभी यह पूरी सूची के माध्यम से मिल जाएगी, लेकिन ज्यादातर समय यह किसी बिंदु पर फंस जाता है और अनिश्चित काल तक लटकता है।प्रोग्राम कई रिमोट एक्टर्स
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()
}
}
मैं गलत क्या कर रहा हूँ
यहाँ कुछ कोड है जो मेरे मशीन पर समस्या पैदा करता है? इसके परिणाम के लिए इंतजार,
जिसमेंfutures.foreach(f => println(f()))
आप बदले में प्रत्येक पर अपने सभी वायदा के माध्यम से लूप और ब्लॉक:
मैंने प्रत्येक अभिनेता के लिए एक अलग बंदरगाह का उपयोग करने का भी प्रयास किया है, लेकिन एक ही परिणाम प्राप्त करें। – Kevin