首页 文章

Scala actor,期货和系统调用导致Thread泄漏

提问于
浏览
1

我正在运行一个复杂的软件与不同的演员(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
Finished Threads

Living threads
Living threads

Edit 1: 在上面的图表示例中,我运行的系统只有3个不同类的actor:Actor1向Actor2发送消息给Actor3发送消息

1 回答

  • 0

    您正在使用 receive ,因此每个actor都将使用自己的线程,并且您至少在此示例中没有提供任何方式让actor终止 . 所以你期望每个演员都有一个新的线程,这个新线程曾经开始 . 如果这就是你所看到的,那么一切都按预期工作 . 如果你想让演员停止运行,你必须让他们最终脱离 while 循环或者在他们或某些人身上调用 sys.exit .

    (另外,在2.11中,旧式Scala actor被弃用,支持Akka actor . )

    你也没有(在上面的代码中)有任何迹象表明未来是否真的完成了 . 如果期货没有完成,他们将继续捆绑线程 .

相关问题