Необходимо ли присоединение CFThread для фоновых процессов?

Предыстория:

Это часть запланированного задания, которое извлекает данные с внешнего сайта (внешний сайт предоставляет API для получения данных через веб-службу) и обновляет базу данных новой информацией. Он извлекает около 3500 элементов данных. Мое текущее запланированное задание создает блоки из CFThread задач, которые запускают по 10 потоков одновременно, и объединяет их перед запуском следующего блока из 10.

Код:

<cfset local.nMaxThreadCount = 10>
<!---retrieve a query that contains the items that need to be updated, approximately 3,500 items--->
<cfset local.qryItemsNeedingUpdate = getItemsNeedingUpdate(dtMostRecentItemPriceDate = local.qryMostRecentItemPriceDate.dtMostRecentItemPrice[1])>
<cfset local.nThreadBlocks = Ceiling(local.qryItemsNeedingUpdate.RecordCount / local.nMaxThreadCount)>

<cftry>
<cfloop index="local.nThreadBlock" from="1" to="#local.nThreadBlocks#">
    <cfif local.nThreadBlock EQ local.nThreadBlocks>
        <cfset local.nThreadCount = local.qryItemsNeedingUpdate.RecordCount MOD local.nMaxThreadCount>
    <cfelse>
        <cfset local.nThreadCount = local.nMaxThreadCount>
    </cfif>
    <cfset local.lstThreads = "">
    <cfloop index="local.nThread" from="1" to="#local.nThreadCount#">
        <cfset local.nQryIdx = ((local.nThreadBlock - 1) * local.nMaxThreadCount) + local.nThread>
        <cfset local.vcThreadName = "updateThread#local.qryItemsNeedingUpdate.nItemID[local.nQryIdx]#">
        <cfset local.lstThreads = ListAppend(local.lstThreads, local.vcThreadName)>

        <!---create the attributes struct to pass to a thread--->
        <cfset local.stThread = StructNew()>
        <cfset local.stThread.action = "run">
        <cfset local.stThread.name = local.vcThreadName>
        <cfset local.stThread.nItemID = local.qryItemsNeedingUpdate.nItemID[local.nQryIdx]>

        <!---spawn thread--->
        <cfthread attributecollection="#local.stThread#">
            <cfset updateItemPrices(nItemID = attributes.nItemID)>
        </cfthread>
    </cfloop>

    <!---join threads--->
    <cfthread action="join" name="#local.lstThreads#" />
</cfloop>
    <cfcatch type="any">
<cflog text="detailed error message logged here..." type="Error" file="myDailyJob" application="yes">
    </cfcatch>
</cftry>

Вопросы:

Нужна ли такая логика для фоновых процессов? То есть CFThread action="join" нужен? Ничто не отображается из потоков, и потоки независимы (не полагайтесь на другие потоки или процесс, который их породил). Потоки обновляют цены в базе данных и умирают. Нужно ли дросселировать потоки, то есть запускать по 10 за раз и присоединяться к ним? Может ли процесс зациклиться и одновременно создать все 3500 потоков? Будет ли ColdFusion ставить дополнительные потоки в очередь и запускать их по мере надобности?


person Scott Jibben    schedule 14.01.2013    source источник


Ответы (1)


«присоединиться» не требуется, если вам не нужно выводить информацию на страницу после завершения потоков.

Потоки будут стоять в очереди; это зависит от используемой версии ColdFusion.

Однако для того, что вы делаете, потоки - это не то, что вам нужно. Вы хотите использовать очередь сообщений, например ActiveMQ или Amazon SQS. Вы можете использовать шлюз событий, например шлюз ActiveMQ, поставляемый с Adobe CF, или написать свой собственный, если вы работаете с другой очередью сообщений или механизмом CF. (Например, я написал систему обмена сообщениями, использующую шлюзы событий Amazon SQS и Railo, написанную на CFML)

person Billy Cravens    schedule 14.01.2013