我们每月运行的流程中最长的部分是自动切片并将某些 PDF 转换为图像。每个 PDF 被读入,转换为 3 个不同的 PDF,然后将这 3 个转换为图像以放置在电子邮件中给客户。PDF 对每个客户都是唯一的,我们每月向至少 15,000 名(通常更像 22k)客户发送一份 PDF。
我们的 PDF 生成和切片已经是多线程的,但我一直在研究并行化它的其余部分。
为此,我已将我们的流程转换为使用 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 实例?