您能否给出一个需要线程的简单场景?谢谢你,尼奇
4 回答
我在需要启动一些后端数据处理以在用户执行某些报告之前将数据制成表格的情况下使用它。所以登录后,我们将使用 cfthread 启动一个任务来为用户构建仓库数据。工作得很好!
因此,可以将 cfthread 视为按需执行异步任务的一种方式。在正确的情况下非常有用!
cfthread
如果与主请求处理代码并行执行某些代码有意义,则使用此选项。
示例:假设您正在上传一个文件目录,并且您需要对每个文件进行相同的处理,也许是将内容保存到数据库中。然后,您可以使用cfthread
异步对每个文件运行处理。考虑这个伪代码:
<cfdirectory directory="x" action="read" name="allFiles" />
<cfloop query="allFiles">
<cfthread action="run" name="thread-#allFiles.name#>
<!--- Read your file in and do processing --->
</cfthread>
</cfloop>
请记住,有一个设置 CF Admin 可以设置您可以通过这种方式生成的线程数!很多还取决于您的系统资源。
还有其他示例更详细地描述了其他用例。只需进行谷歌搜索。我推荐 Ben Nadal 的cfthread 入门书作为一个很好的起点。
另一个警告:线程是所有问题的解决方案!我以前用它们来处理队列处理并遇到了麻烦。
总之cfthread
是ColdFusion的一大特色,尽情享受吧!
我在两种情况下使用过 cfthread。
如上所述,当我想在我的主线程做其他事情时进行异步处理时,我使用了它。例如,我用它来加载 RSS 数据,同时生成页面的其余部分。由于调用 RSS 源需要几秒钟,所以我在开始任何其他处理之前启动了一个线程。它在我查询、绘制布局等时运行。然后我加入线程并显示 RSS 数据。这使我不必在填充 RSS 时暂停页面加载。
我使用的第二种方法是使用调度程序的按需替代方案。我们正在生成复杂的 PDF 文档。生成它们的人并不立即需要它们,因此我们创建了一个未连接的线程来处理 PDF,而不是在我们生成文档时让用户卡住。然后,我们限制了任何时候正在处理的 cfthreads 的数量。现在,无论负载如何,cfthread 都会简单地排队,并在资源可用时进行处理。
<!--- store value into message varaible --->
<cfset variables.message = "It's orginal value.">
<!--- create new thread --->
<cfthread name="ThreadOne">
<!--- overwrite new value into existing variable. --->
<cfset variables.message = "It comes from thread.">
</cfthread>
<!--- join thread --->
<!---
If we leave this join, the code within thread will execute but won't display the value.
--->
<cfthread action="join" name="ThreadOne" />
<!--- Output --->
<cfoutput>#variables.message#</cfoutput>
检查上面的编码。这有点清楚。