1

我正在使用sPdf 的 run 方法将 HTML 呈现为 PDF 文件。

run用途scala.sys.process.ProcessBuilder及其!方法:

/** Starts the process represented by this builder, blocks until it exits, and
    * returns the exit code.  Standard output and error are sent to the console.
    */
  def ! : Int

我的控制器正在使用 aFuture异步执行转换,但不会 spdf 阻止所有其他临时执行?

 Future { pdf.run(sourceUrl, outputStream) } map { exitCode =>
     outputSteam.toByteArray
 }

更新

感谢您的回答,保罗做了一些测试,是的,看起来是这样的:)

如果我像这样更新 sPdf 的运行:

  def run[A, B](sourceDocument: A, destinationDocument: B)(implicit sourceDocumentLike: SourceDocumentLike[A], destinationDocumentLike: DestinationDocumentLike[B]): Int = {
      println("start/ " + System.currentTimeMillis)
      < ... code removed ... >
      val result = (sink compose source)(process).!
      println("finish/ " + System.currentTimeMillis)
      result
  }

我执行三个连续的请求,标准输出打印

start 1461288779013
start 1461288779014
start 1461288779014
finish 1461288781018
finish 1461288781020
finish 1461288781020

这看起来像异步执行。

4

1 回答 1

1

这是Pdf#run

  def run[A, B](sourceDocument: A, destinationDocument: B)(implicit sourceDocumentLike: SourceDocumentLike[A], destinationDocumentLike: DestinationDocumentLike[B]): Int = {
    val commandLine = toCommandLine(sourceDocument, destinationDocument)
    val process = Process(commandLine)
    def source = sourceDocumentLike.sourceFrom(sourceDocument) _
    def sink = destinationDocumentLike.sinkTo(destinationDocument) _

    (sink compose source)(process).!
  }

没有阻止并行执行的同步。假设ExecutionContext有足够的可用线程,

Future { pdf.run(sourceUrl, outputStream) } map { exitCode =>
    outputSteam.toByteArray
}

Future { pdf.run(sourceUrl, outputStream) } map { exitCode =>
    outputSteam.toByteArray
}

将并行执行。


相反,如果该run方法被一个块包围,那么每个实例synchronized只会执行一次调用。Pdf但是这里没有理由阻止并发,所以作者没有。

于 2016-04-22T00:49:40.900 回答