Tôi bắt đầu hai tác nhân từ xa trên một máy chủ mà chỉ phản hồi bất kỳ nội dung nào được gửi cho họ. Sau đó tôi tạo một diễn viên khác gửi một số tin nhắn (sử dụng !!) cho cả hai diễn viên và giữ một danh sách các đối tượng tương lai giữ các câu trả lời từ các diễn viên này. Sau đó, tôi lặp qua Danh sách này tìm nạp kết quả của mỗi Tương lai. Vấn đề là hầu hết thời gian một số tương lai không bao giờ trở lại, thậm chí nghĩ rằng các diễn viên tuyên bố nó đã gửi trả lời. Vấn đề xảy ra ngẫu nhiên, đôi khi nó sẽ được thông qua toàn bộ danh sách, nhưng phần lớn thời gian nó bị mắc kẹt tại một số điểm và treo vô thời hạn.chương trình bị treo khi sử dụng nhiều tương lai với nhiều diễn viên từ xa
Dưới đây là một số mã trong đó sản xuất các vấn đề trên máy tính của tôi:
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()
}
}
Tôi đang làm gì sai?
Tôi cũng đã thử sử dụng một cổng khác cho mỗi tác nhân nhưng có cùng kết quả. – Kevin