2

我在 ColdFusion 中有一个循环应用程序 ID 列表的例程。在该列表中,发生了许多事情,包括 PDF 文档的生成和合并。这变得非常慢,所以我看了一下 cfthread 可以为我做什么。结果很有希望;40 秒的运行时间减少到 4 秒。

然而,cfthread 本质上是不知道循环在做什么。这是一个代码示例。

<cfloop list="#form.User_Id#" index="x">
    <cfthread name="thread#x#" action="run" index="#x#">
          <cfdocument format="PDF" name="report" filename="#fileToDownload#" overwrite="yes">
          <cfdocumentsection>
          <cfquery name="example" datasource="DS">
             SELECT * FROM Table
             WHERE ID = #x#
          </cfquery>

          <cfoutput query="example">
               All the output
          </cfoutput>
          </cfdocumentsection>
    </cfthread>
</cfloop>

<cfthread action="join" />

最终发生的是每次循环迭代都会重复列表中的最后一个值。那么我到底需要做什么才能完成这项工作呢?

谢谢!

4

1 回答 1

1

正如亚当所说,可能需要更多。

如果您在此处寻找“最终结果”,其中您的“最终 PDF”取决于循环/线程代码正在完成的工作,那么上面的代码将为您提供不一致和不可预测的结果。

另请注意,上面的代码有可能根据列表的长度创建任意数量的线程。它将创建这些线程 - 正如您所指出的 - 作为“即发即弃” - 让他们同时做他们的事情。您需要做的是弄清楚 A)您需要多少线程或您的系统可以处理,然后 B)设计您的循环,以便您适当地终止加入您的线程。这样,它们就是这个请求的一部分,而不仅仅是在主请求完成后的任意部分工作工具。

Ray (Camden) 在他的博客上有一个很好的例子,他循环了 10 次,然后将它们全部连接在一起。如果您的代码经常或同时运行(您可能超出线程请求限制),这可能不可行,但可能是计划任务的正确方法。这是Ray文章的链接。

http://www.raymondcamden.com/2009/05/18/CFTHREAD-When-to-join

您可以考虑谨慎的“块”工作,使您的线程选择可预测。例如,在您的循环中,您最多可以创建 5 个线程,然后在第 5 次迭代中加入它们,第 6 次迭代将开始下一个分组……明白我的意思吗?

于 2015-12-04T14:53:05.247 回答