斯卡拉ProcessLogger及未来:我怎样才能确保所有线路的回调被称为的onComplete块之

2019-10-24 02:56发布

import scala.sys.process._
import scala.concurrent._ // (future)
import ExecutionContext.Implicits.global // (future)

/* run "ls /opt"
 * which outputs 2 lines:
 *  - "X11"
 *  - "local"
 */
val command = Process(Seq("ls", "/opt"), None, "LANG" -> "")

val process = command.run(ProcessLogger(line => {
  Thread.sleep(1000) // slow execution down
  println(Thread.currentThread)
  println(line)
  println("")
}))

Future {
  process.exitValue // blocks until the process exits
}.onComplete { results =>
  println(Thread.currentThread)
  println("process exited: after last line callback finished?")
  println("DONE")
}

输出( 顺序预期 ,但是这总是这样?):

Thread[Thread-47,5,run-main-group-0]
LINE X11

Thread[Thread-47,5,run-main-group-0]
LINE local

Thread[ForkJoinPool-1-worker-3,5,run-main-group-0]
process exited: after last line callback finished?
DONE

因为它似乎确定onComplete 后线相关的输出完全是在块输出其文本。 但是,这始终是这样吗? 谁可以确保不同的线程中运行一个接一个? 我可以依靠这个所谓的订单?

Answer 1:

甲未来是保持其可在一些点变得可用的值的对象。 该值通常是一些其他的计算结果:

  1. 如果计算尚未完成,我们说未来没有完成。
  2. 如果计算已经与值或异常完成后,我们认为未来完成。

完成可采取两种形式:

  1. 当未来完成了价值,我们认为未来成功与价值完成。

  2. 当未来完成由计算抛出一个异常,我们认为未来是失败,该异常。

创建一个未来对象的最简单方法是调用哪个开始异步计算,并返回一个未来保持该计算的结果的未来的方法。 一旦将来完成时,结果变得可用。

需要注意的是未来[T]是其表示未来对象,而未来的是其中创建和调度异步计算,然后返回其将与该计算的结果来完成未来对象的方法的类型。

DOC

你可以看到在更多实施细节的github



文章来源: Scala ProcessLogger & Future: How can I make sure all line callbacks are called BEFORE the onComplete block?