Ghostscript.NET 多线程问题

本文关键字:问题 多线程 NET Ghostscript | 更新日期: 2023-09-27 18:30:29

我们每月运行的过程中最长的部分是自动切片和将一些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 实例?

Ghostscript.NET 多线程问题

我正在使用多线程 Ghostscript.NET。您上面共享的代码应该在 Parallel.For 循环中。是的,整个代码意味着从

GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);

直到最后,它应该有效。如上所述@KenS,每个多线程进程都应使用不同的GhostscriptProcessor实例。