最近,我一直在使用Akka开发不同的例子;例如playtool P2P模型。为了更好地进行评估,基准测试和理解,我尝试使用Akka介绍的different types of dispatchers来运行示例。
我遇到的问题是专门使用BalancingDispatcher
和thread-pool-executor
(默认情况下应该是这种类型的调度程序),应用程序倾向于输入总数等待状态;这是一个僵局吗?!当我使用jstack
获取应用程序中线程的转储时,突出的观察是所有调度程序线程都处于TIMED_WAITING
或WAITING
状态。
我很想知道这是否因应用程序设计而陷入僵局?而且,更重要的是,我如何调试或深入处理问题?
此应用程序中最有用的代码片段可以是:
每个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