我有一些處理大約30,000條記錄的代碼。基本輪廓是這樣的:如何在「線程池」中分割一系列值?
startRecordID = 2345;
endRecordID = 32345;
for(recordID=startRecordID; recordID <= endRecordID; recordID++){
// process record...
}
現在,這種處理需要很長的時間,我想有15個線程的線程池,並給每個線程recordIDs到的進程列表,然後加入他們都結束了。
在我的代碼完成了這一以往認爲看起來是這樣的,在那裏是recordLists
子陣列的陣列,以被處理的記錄每片含1/15:
<cfset numThreads = 15 />
<!--- keep a running list of threads so we can join them all at the end --->
<cfset threadlist = "" />
<cfloop from="1" to="#numThreads#" index="threadNum">
<cfset threadName = "recordProcessing_#threadNum#" />
<cfset threadlist = listAppend(threadlist, threadName) />
<cfthread action="run" name="#threadName#" recordList="#recordList[threadNum]#">
<cfloop from="1" to="#ArrayLen(recordList)#" index="recordIndex">
<cfset recordID = recordList[recordIndex] />
... process recordID ...
</cfloop>
</cfthread>
</cfloop>
<!--- Join all threads before continuing --->
<cfthread action="join" name="#threadlist#" timeout="4000"/>
此工作良好(雖然我也會將這個舊的代碼轉換爲cfscript :)),但是創建子數組的recordLists數組並不那麼簡單......我能想到的做法是從startRecordID- endRecordID,將每個數組添加到數組中,然後在其上運行一個ArrayDivide函數(我們已經在代碼庫中定義了該函數),將其分解爲numThreads(本例中爲15)相等的子數組。考慮到我有範圍的開始,範圍的結束以及我想要分割的線程的數量,是不是有一種更簡單的方法來分解它並將它分配給線程?
只是想知道爲什麼15個線程?沉重的I/O?你有多少核心可以訪問? – Henry
我建議使用你現有的循環。 –
@DanBracuk - 怎麼樣?你能解釋我可以如何將線程池合併到該循環中嗎? – froadie