私たちが実行する毎月のプロセスの中で最も長い部分は、一部の PDF の自動スライスと画像への変換です。それぞれの PDF が読み込まれ、3 つの異なる PDF に変換され、それら 3 つが画像に変換されて、顧客への電子メールに配置されます。PDF は顧客ごとに一意であり、少なくとも 15,000 (多くの場合 22,000 人) の顧客に毎月 PDF を送信しています。
PDF の生成とスライスは既にマルチスレッド化されていますが、残りの部分を並列化することを検討しています。
そのために、Ghostscript.NET を使用するようにプロセスを変換しました。Ghostscript.NET は、Ghostscript の並列化をサポートするライブラリであると主張しています。
そのために、このコードを Parallel.Foreach() ループでラップしました。ループの各反復は、異なる初期 PDF で機能します。
GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL); GhostscriptProcessor processor = null; try { //sArgs is an array of arguments for ghostscript processor = new GhostscriptProcessor(gsVersionInfo, true); processor.StartProcessing(sArgs, new ConsoleStdIO(true,false,true)); while (processor.IsRunning) { Thread.Sleep(100); } }
上記のコードを実行し、Parallel.Foreach が 1 つのスレッドのみを使用するように強制すると (並列化を無効にします)、以前と同じように実行され、すべてのファイルが正しく生成されます。5 段階の並列化を使用すると、エラーが発生し始めます。これらのエラーはさまざまですが、不正な形式の入力 PDF ファイルを示している傾向があり、ghostscript プロセッサは実際にはスレッドセーフではなく、互いの入力を踏んでいると思われます。
Ghostscript.NET を正しく使用して、ghostscript の複数のインスタンスを異なるファイルで同時に実行するにはどうすればよいですか?