繁体   English   中英

Scala参与者,期货和系统调用导致线程泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM