加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 当多个远程演员使用多个期货时,程序会挂起

发布时间:2020-12-16 18:32:19 所属栏目:安全 来源:网络整理
导读:我在一个主机上启动两个远程演员,它们只是回显发送给他们的任何东西.然后我创建另一个actor,它向两个actor发送一些消息(使用!!),并保留一个List of Future对象来保存这些actor的回复.然后我遍历此List获取每个Future的结果.问题在于大多数时候某些期货永远不
我在一个主机上启动两个远程演员,它们只是回显发送给他们的任何东西.然后我创建另一个actor,它向两个actor发送一些消息(使用!!),并保留一个List of Future对象来保存这些actor的回复.然后我遍历此List获取每个Future的结果.问题在于大多数时候某些期货永远不会回归,甚至认为这位演员声称它已经发出了回复.问题是随机发生的,有时它会通过整个列表,但大多数情况下它会在某个时刻陷入困境并无限期挂起.

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

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()))

在其中循环遍历所有期货并依次阻止每个期货,等待其结果.阻碍期货通常是一个坏主意,应该避免.您想要做的是指定在未来结果可用时执行的操作.试试这个:

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

以下是另一种说法:

for (future <- futures; result <- future) { println(result) }

This blog entry是关于期货受阻以及monadic期货如何克服它的一个很好的入门读物.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读