Akka调度员等待永远

时间:2012-06-01 09:18:39

标签: scala concurrency actor akka

最近,我一直在使用Akka开发不同的例子;例如playtool P2P模型。为了更好地进行评估,基准测试和理解,我尝试使用Akka介绍的different types of dispatchers来运行示例。

我遇到的问题是专门使用BalancingDispatcherthread-pool-executor(默认情况下应该是这种类型的调度程序),应用程序倾向于输入总数等待状态;这是一个僵局吗?!当我使用jstack获取应用程序中线程的转储时,突出的观察是所有调度程序线程都处于TIMED_WAITINGWAITING状态。

我很想知道这是否因应用程序设计而陷入僵局?而且,更重要的是,我如何调试或深入处理问题?

此应用程序中最有用的代码片段可以是:

每个search中的Node方法向对等方询问搜索查询并返回结果

  def search(query: String): Collection[String] = {
    var result: List[String] = List[String]()
    this.list().toList.foreach { q =>
        if (q.contains(query)) {
            result = query :: result
        }
    }
    implicit val timeout = Timeout(1 hour)
    // println("[" + this + "]'s peers: " + peers)
    for (p <- peers) {
      // println("asking [" + p + "] for [" + query + "]")
      val tmp: Future[Collection[String]] = ask(p.asInstanceOf[ActorRef], _search(query)).mapTo[Collection[String]]
      msgs.incrementAndGet()
      val l = Await.result(tmp, timeout.duration).asInstanceOf[Collection[String]]
      l.toList.foreach { q =>
        if (q.contains(query)) {
            result = q :: result
        }
      }
    }
    result.toList
  }

评估节点网络的主要部分中的代码段:

import context.dispatcher
var start = System.currentTimeMillis
val futures = List.fill(querySize)(ask(root, _search("_" + r.nextInt(100))).mapTo[Collection[String]])
val results = Future.sequence(futures)
Await.ready(results, Timeout(1000 hour).duration)
var end = System.currentTimeMillis

0 个答案:

没有答案