我们运行的每月流程中最长的部分是自动切片并将一些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实例?
答案 0 :(得分:2)
我正在使用带有多线程的Ghostscript.NET。 您在上面共享的代码应该在Parallel.For循环中。是的,整个代码意味着从
开始GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);
直到最后,它应该工作。正如上面提到的@KenS,每个多线程进程应使用GhostscriptProcessor
的不同实例。