2

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

4

1 回答 1

2

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

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

直到最后,它应该可以工作。正如上面提到的@KenS,每个多线程进程都应该使用不同的GhostscriptProcessor.

于 2014-12-02T06:59:36.320 回答