У меня есть код, который обрабатывает около 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 потоков? Тяжелый ввод-вывод? На сколько ядер вы имеете доступ? – Henry
Предлагаю использовать существующий цикл. –
@ DanBracuk - как? можете ли вы объяснить, как я могу включить объединение потоков в этот цикл? – froadie