2013-01-14 3 views
3

배경 :백그라운드 프로세스에 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은 여분의 스레드를 대기열에 넣고 시간이 경과함에 따라 실행합니까?

답변

3

스레드가 완료된 후 정보를 페이지에 출력해야하는 경우가 아니면 "조인"이 필요하지 않습니다.

스레드가 대기합니다. 이는 실행중인 ColdFusion 버전에 따라 다릅니다.

그러나 당신이하고있는 것을 위해, 스레드는 당신이 원하는 것이 아닙니다. ActiveMQ 또는 Amazon SQS와 같은 메시지 대기열을 사용하려고합니다. Adobe CF와 함께 제공되는 ActiveMQ 게이트웨이와 같은 이벤트 게이트웨이를 사용하거나 다른 메시지 대기열 또는 CF 엔진으로 작업하는 경우 직접 작성할 수 있습니다. (예를 들어, CFML로 작성된 Amazon SQS 및 Railo 이벤트 게이트웨이를 사용하는 메시징 시스템을 작성했습니다)