Ghostscript.NET 多线程问题
Posted
技术标签:
【中文标题】Ghostscript.NET 多线程问题【英文标题】:Ghostscript.NET Multithreading Issue 【发布时间】:2014-11-13 19:58:58 【问题描述】:我们每月运行的流程中最长的部分是自动切片并将某些 PDF 转换为图像。每个 PDF 被读入,转换为 3 个不同的 PDF,然后将这 3 个转换为图像以放置在电子邮件中给客户。每个客户的 PDF 文件都是唯一的,我们每月向至少 15,000 名(通常更接近 22,000)名客户发送一份 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 实例?
【问题讨论】:
ghostscriptnet.codeplex.com/discussions/569876 @Aybe:我们使用的是最新版本的 GhostScript。不幸的是,我已经看到了这个(相当令人失望的)问题:( 您可能应该在 CodePlex 或 GitHub 存储库中提问。 我不是 .NET 开发人员,所以恐怕上面的代码对我来说毫无意义,但是我可以说虽然 Ghostscript 能够进行多线程 渲染,它不能执行多线程解释。如果要一次处理多个输入文件,则需要多个进程来执行此操作,不能使用同一个 Ghostscript 实例来处理多个输入文件。 为什么需要 while (processor.IsRunning),StartProcessing 不会阻塞进程? 【参考方案1】:我正在使用具有多线程的 Ghostscript.NET。 您在上面共享的代码应该在 Parallel.For 循环内。是的,这意味着从
开始的整个代码GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);
直到最后,它应该可以工作。正如上面@KenS 提到的,每个多线程进程应该使用不同的GhostscriptProcessor
实例。
【讨论】:
以上是关于Ghostscript.NET 多线程问题的主要内容,如果未能解决你的问题,请参考以下文章
如何获得有效的 x64 THREADSAFE Ghostscript DLL
如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A