2017-06-05 27 views
1

即时查看处理cfthread中的查询,因为原始数据可能是数千请求。我看着使用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> 

或者,这是这个基本过程

<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> 
较为理想的基本使用cfthread的

我试着去寻找最佳的平衡,所以我不崩溃我的服务器,但我也能处理很多的这些要求从外部服务获取信息,但IM苦苦寻找这是最好的方向,或者如果有一个更好的过程一起处理远程请求对大众

在此先感谢

+0

睡眠的目的是什么?此外,这将是一个预定的工作或用户在做什么? –

+0

我把睡眠放在那里的原因是,如果它花费很长时间来完成它的任务,我认为它在短暂的时间内恢复之前会暂时休息一下。这样做的目的是在后台运行带有ajax ping的加载页面,以计算剩余时间。所以要回答你的问题,用户正在做的事情,但很好地呈现 – user125264

+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# 

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