Coldfusion 在cfloop中使用cfthread会导致随机输出

Coldfusion 在cfloop中使用cfthread会导致随机输出,coldfusion,cfloop,cfthread,Coldfusion,Cfloop,Cfthread,我在ColdFusion中有一个例程,它在应用程序ID列表上循环。在这个列表中,发生了很多事情,包括生成和合并PDF文档。这变得非常慢,所以我看了看cfthread能为我做些什么。结果令人鼓舞;40秒的运行时间缩短为4秒 然而,cfthread本质上不知道循环在做什么。这是一个代码示例 <cfloop list="#form.User_Id#" index="x"> <cfthread name="thread#x#" action="run" index="#x#"&

我在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" />
最终的结果是,每个循环迭代都会重复列表中的最后一个值。那么我到底需要做些什么才能让这一切顺利进行呢


谢谢

可能需要像亚当说的那样多一点

如果您在这里寻找最终结果,最终PDF取决于循环/线程代码所做的工作,那么上面的代码将给您不一致和不可预测的结果

还要注意,上面的代码可能会根据列表的长度创建任意数量的线程。它将创建这些线程-正如您所注意到的-作为火和忘记-让他们同时做他们的事情。你需要做的是计算出你需要多少线程或者你的系统可以处理多少线程,然后设计你的循环,这样你就可以适当地终止或者加入你的线程。这样,它们就是这个请求的一部分,而不仅仅是在主请求完成后的任意工件

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


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

您没有向我们展示足够的代码。很多动作都出了问题,但你没有告诉我们。没有必要向我们展示那些运作良好的行动,但你需要向我们展示那些运作不正常的大行动!很少有值得注意的事情。首先,cfthread中没有index属性。第二,在加入线程时,您需要在name属性下传递要加入的线程列表。我想我的编辑注释会显示在这里。我充实了中间的部分,以显示索引的使用位置。我尝试在连接中使用线程列表,但没有帮助。这是我第一次尝试使用cfthread,所以我坦率地承认我对它没有太多的了解!请详细说明最终发生的情况是,每个循环迭代都会重复列表中的最后一个值。当显示最终输出时,我有7条记录,但它们都是ID 99。线程连接似乎只将最后一个循环连接到自身。这个链接让我找到了正确的位置。我犯了一个错误,在查询中使用循环中的索引作为变量。当我将其更改为使用thread.name时,我获得了cfthread跟踪的唯一ID,现在它工作正常。谢谢