[英]Scala actors, futures and system calls resulting in Thread leaks
我正在运行一个具有不同角色(scala角色)的复杂软件。 其中一些执行使用scala期货以避免锁定并继续处理收到的新消息(简化代码):
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时,该系统正在运行时,活动线程数一直在增加。 恐怕我遇到某种线程泄漏,但是我无法检测出问题出在哪里。
这是完成线程和活动线程的一些屏幕截图(我隐藏了一些与此问题无关的活动线程)
成品螺纹
活动线程
编辑1:在上面的图形示例中,我仅使用3个不同类的actor运行系统:Actor1将消息发送到Actor2,然后将消息发送给Actor3
您使用的是receive
因此每个actor都将使用其自己的线程,并且至少在此示例中,您没有提供任何方法终止actor。 因此,您可能希望每个actor都有一个新线程已经启动。 如果您看到的是那样,那么一切都按预期工作。 如果要使actor停止运行,则必须让它们最终退出while
循环,或在它们上调用sys.exit
或类似方法。
(此外,在2.11版中,老式Scala演员被弃用,而Akka演员被弃用。)
您(在上面的代码中)也没有任何迹象表明未来是否真正完成。 如果期货没有完成,他们将继续束缚线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.