배경 :백그라운드 프로세스에 CFThread 조인이 필요합니까?
이 외부 사이트 (외부 사이트가 웹 서비스를 통해 데이터를 검색하기위한 API를 제공)로부터 데이터를 검색하고 새 정보로 데이터베이스를 업데이트하는 예약 된 작업의 일부입니다. 약 3,500 개의 데이터 항목을 검색 중입니다.
<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>
질문 :
나의 현재 예약 된 작업은 한 번에 10 개 스레드를 실행하고 10
코드의 다음 블록을 시작하기 전에 그들을 조인 CFThread
작업의 블록을 생성 백그라운드 프로세스에 필요한 이런 종류의 논리입니까? 즉, CFThread action="join"
이 필요합니까? 스레드로부터 표시되는 것이 없으며 스레드는 독립적입니다 (다른 스레드 나 스레드를 생성 한 프로세스에 의존하지 마십시오). 스레드는 데이터베이스의 가격을 업데이트하고 죽습니다. 스레드를 조절해야합니다 (즉, 한 번에 10 개씩 실행하여 결합해야합니까?). 프로세스가 반복하여 3,500 개의 모든 스레드를 한 번에 만들 수 있습니까? ColdFusion은 여분의 스레드를 대기열에 넣고 시간이 경과함에 따라 실행합니까?