2016-04-21 4 views
0

私はsPdf's run methodを使ってHTMLをPDFファイルとしてレンダリングしています。scala.sys.process.ProcessBuilderの同時実行

runscala.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ブロックされますか?あなたの答えPaulため

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

UPDATE

おかげで少しテストを行なったし、私はそうのような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 
    } 

と私は3つの連続した要求を実行しますstdoutのプリント

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

非同期実行のようです。

+1

'ProcessBuilder'は他のシステムスレッドではなく実行スレッドをブロックしますが、実際の答えは' spdf'の仕組みによって異なります。一度に複数のプロセスを起動させると、ブロックする必要はありません。 – jkinkead

答えて

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).! 
    } 

並列実行を防止同期はありません。

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

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

が並列に実行される、ExecutionContextは十分に使用可能なスレッドを持っていると仮定。代わりに、run方法があった場合


、たとえば、​​ブロックに囲まれた、唯一の呼び出しはPdfインスタンスごとに実行します。しかし、ここで並行性を防ぐ理由はないので、作者はそうしなかった。

+0

お返事ありがとうございます、私は確認するための質問を更新しました! – tgk