我正在考虑在cfthread中处理查询,因为原始数据可能是数千个请求。我正在考虑使用cfthread,这样我就可以让它在后台处理。我知道cfthread上有很多信息,但我很难理解它。
所有这些都归结为使用cfhttp的远程调用的数量,以及它们是在单个线程中还是应该独立进行。
远程调用每次可能需要5- 10秒,并且数据库更新非常小,只需在处理它们的查询上更新true false值。
<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>我正在努力寻找最佳的平衡,这样我的服务器就不会崩溃,但我也能够处理大量从外部服务获取信息的请求,但我正在努力寻找最好的方向,或者是否有一个更好的进程来处理大量的远程请求
提前感谢
发布于 2017-06-05 20:41:03
您不能仅仅产生n线程,然后抱着最好的希望。过多的线程会导致CPU调度器切换上下文的频率过高,从而导致整体速度变慢。我也不明白为什么要让线程以高(Er)优先级运行,因为机器上还有其他事情需要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#在这里,什么效果最好取决于您如何获取需要处理的记录。在开始循环之前,你可能需要计算记录。
https://stackoverflow.com/questions/44360092
复制相似问题