我在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" />
最终发生的事情是每次循环迭代都会重复列表中的最后一个值。那么我到底需要做些什么呢?
谢谢!
答案 0 :(得分:1)
亚当说,可能需要更多一点。
如果有&#34;最终结果&#34;你在这里寻找你的&#34;最终PDF&#34;取决于循环/线程代码所做的工作,上面的代码将给你不一致的&amp;不可预知的结果。
另请注意,上面的代码有可能根据列表的长度创建任意数量的线程。它将创建这些线程 - 正如您所指出的那样 - &#34; fire and forget&#34; - 让他们同时做他们的事情。你需要做的是弄清楚A)你需要多少线程或你的系统可以处理然后B)设计你的循环,以便你终止或加入你的线程。这样他们就是这个请求的一部分,而不仅仅是在完成主要请求之后的任意工作。
雷(卡姆登)在他的博客上有一个很好的例子,他循环了10次然后将他们加在一起。如果您的代码经常或同时运行(您可能会超出您的线程请求限制),那么这可能是不可行的,但对于计划任务可能是正确的方法。这是Ray的文章的链接。
http://www.raymondcamden.com/2009/05/18/CFTHREAD-When-to-join
你可以谨慎地思考&#34; chunks&#34;使您的线程选择可预测的工作。例如,在你的循环中,你可以创建最多5个线程,然后在第5次迭代中 join 它们,6次迭代将开始下一次分组...看看我的意思?