使用cfthread的最佳方法

时间:2017-06-05 00:13:06

标签: coldfusion cfhttp

我正在研究在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>

我试图找到最佳平衡,所以我不会崩溃我的服务器,但我也能够处理很多这些请求从外部服务获取信息,但我很难找到哪个是最佳方向,或者是否有一个更好的过程,一起处理群发的远程请求

提前致谢

1 个答案:

答案 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#

这里最好的方法取决于您如何获取需要处理的记录。您可能需要在开始循环之前计算记录等。