Scala进程中是否应标记Scala.concurrent.blocking?

时间:2014-10-29 11:28:58

标签: scala akka

我创建了一个Scala进程,我读到这是阻塞的,它是否应该包含在scala.concurrent.blocking中?我很困惑,因为Process会在这里回调log参数,这需要这个线程做我想做的事情,所以它没有完全阻塞?

import scala.sys.process.Process
import scala.concurrent.Future
import scala.sys.process.ProcessLogger

def something = Future {
  val log = ProcessLogger(normal => {
    lines = lines :+ normal
    Logger.info("SFTPline added: " + normal)
  },
  error => {
      Logger.info("SFTPERROR: " + error)
  })

  val success = scala.concurrent.blocking {
    val result = Process(command).!(log)

    lines.mkString("").contains("\"success\":true") && (result == 0)
  }
}

2 个答案:

答案 0 :(得分:2)

Scala进程实际上是由run函数执行的,它返回Process并在不阻塞的情况下扩展它。 '!'是一个调用' run'函数然后调用Process的exitValue()函数。 " exitValue()'阻止过程退出)
调用Process(command).!(log)实际上与run(log).exitValue()相同(嗯,不完全相同,但您可以明白这一点......请参阅ProcessBuilderImpl.scala
如果您不想被阻止,请改为调用run函数。

答案 1 :(得分:0)

鉴于您返回的内容不是Future,您的代码必须在某处阻止(我不知道您的示例是什么"在scala Future" ) - 如果你调用一个调用回调的函数,然后阻止等待该回调被调用,你仍然会阻塞。所以是的,宣布它阻止。