我正在运行一个复杂的软件与不同的演员(scala演员) . 其中一些执行使用scala future来避免锁定并继续处理新收到的消息(简化代码):
def act {
while (true) {
receive {
case (code: String) =>
val codeMatch = future { match_code(code) }
for (c <- codeMatch)
yield callback(code)(JSON.parseJSON(c))
}
}
}
def match_code(code: String) {
val result = s"my_script.sh $code" !!
}
我注意到 jvisualvm
和Eclipse Debugger看到当系统运行时活动线程的数量不断增加 . 我担心我有某种线程泄漏,但我无法检测出问题出在哪里 .
以下是已完成和活动线程的一些屏幕截图(我隐藏了一些与此问题无关的实时线程)
Finished Threads
Living threads
Edit 1: 在上面的图表示例中,我运行的系统只有3个不同类的actor:Actor1向Actor2发送消息给Actor3发送消息
1 回答
您正在使用
receive
,因此每个actor都将使用自己的线程,并且您至少在此示例中没有提供任何方式让actor终止 . 所以你期望每个演员都有一个新的线程,这个新线程曾经开始 . 如果这就是你所看到的,那么一切都按预期工作 . 如果你想让演员停止运行,你必须让他们最终脱离while
循环或者在他们或某些人身上调用sys.exit
.(另外,在2.11中,旧式Scala actor被弃用,支持Akka actor . )
你也没有(在上面的代码中)有任何迹象表明未来是否真的完成了 . 如果期货没有完成,他们将继续捆绑线程 .