scala.sys.process.ProcessBuilder 并发
Concurrency with scala.sys.process.ProcessBuilder
我正在使用 sPdf's run method 将 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
我的控制器正在使用 Future
异步执行转换,但 spdf 不会阻止所有其他临时执行吗?
Future { pdf.run(sourceUrl, outputStream) } map { exitCode =>
outputSteam.toByteArray
}
更新
感谢您的回答Paul 做了一点测试,是的,看起来是这样:)
如果我像这样更新 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
}
我执行了三个连续的请求,stdout 打印出来
start 1461288779013
start 1461288779014
start 1461288779014
finish 1461288781018
finish 1461288781020
finish 1461288781020
这看起来像是异步执行。
这是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
实例只会执行一次调用。但是这里没有理由阻止并发,所以作者没有。
我正在使用 sPdf's run method 将 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
我的控制器正在使用 Future
异步执行转换,但 spdf 不会阻止所有其他临时执行吗?
Future { pdf.run(sourceUrl, outputStream) } map { exitCode =>
outputSteam.toByteArray
}
更新
感谢您的回答Paul 做了一点测试,是的,看起来是这样:)
如果我像这样更新 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
}
我执行了三个连续的请求,stdout 打印出来
start 1461288779013
start 1461288779014
start 1461288779014
finish 1461288781018
finish 1461288781020
finish 1461288781020
这看起来像是异步执行。
这是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
实例只会执行一次调用。但是这里没有理由阻止并发,所以作者没有。