我正在研究在cfthread中处理查询,因为原始数据可能是数千个请求。我正在使用cfthread 所以我可以在后台进行处理。我知道cfthread上有很多信息,但是我很难理解它。
这一切归结为使用cfhttp的一些远程调用,以及它们是在单个线程中还是应该独立使用。
远程调用每次可能需要5到10秒,数据库更新非常小,只需更新查询的真假值 处理它们。
<cfthread action="run" name="myThreadName" priority="high">
<!--- do a query --->
<cfloop query="myQuery">
<!--- do a remote call --->
<!--- process remote call response --->
<!--- update local dbtables to indicate process is complete --->
<!--- sleep using <cfset sleep(5000)> --->
</cfloop>
</cfthread>
或者这是cfthread在这个基本过程中更理想的基本用途
<cfloop from="1" to="1000" index="idx">
<cfthread action="run" name="myThreadName" priority="high">
<!--- do a query --->
<!--- do a remote call --->
<!--- process remote call response --->
<!--- update local dbtables to indicate process is complete --->
<!--- sleep using <cfset sleep(5000)> --->
</cfthread>
</cfloop>
我试图找到最佳平衡,所以我不会崩溃我的服务器,但我也能够处理很多这些请求从外部服务获取信息,但我很难找到哪个是最佳方向,或者是否有一个更好的过程,一起处理群发的远程请求
提前致谢
答案 0 :(得分:0)
您不能只生成n
个帖子并希望获得最佳效果。线程太多会导致CPU调度程序过于频繁地切换上下文,从而导致整体减速。我也不明白为什么你希望线程以高(呃)优先级运行,因为机器上还有其他东西需要CPU时间。它会简单地导致其他线程的延迟,而许多高优先级线程仍会在彼此之间争夺CPU时间。那时也不需要线程暂停(休眠)。
您需要充分利用这两种方法。考虑这样的事情:
<cfset numberOfThreads = 8>
<cfset numberOfRemoteCallsPerThread = 4>
<cfloop from="1" to="#numberOfThreads#" index="threadIndex">
<!--- do a query and split the number of records to process by dividing/offsetting --->
<cfthread name="myThread_#threadIndex#">
<!--- do a remote call --->
<!--- process remote call response --->
<!--- update local dbtables to indicate process is complete --->
</cfthread>
</cfloop>
这将有效地平行您的处理。每个线程将处理一组预定的记录。要分割记录,您可以执行以下操作:
SELECT
<data to send>
WHERE
<filter records to process>
LIMIT
#((threadIndex - 1) * numberOfRemoteCallsPerThread)#, #numberOfRemoteCallsPerThread#
这里最好的方法取决于您如何获取需要处理的记录。您可能需要在开始循环之前计算记录等。