Требуется ли соединение 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 ставить в очередь дополнительные потоки и запускать их по мере необходимости?

1 ответ

Решение

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

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

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

Другие вопросы по тегам