2012-09-17 85 views
3

我有一些代碼嘗試創建100個線程http調用。 ,40套起我的HTTP調用的結果,儘管循環是從1 - - 這似乎在約40Coldfusion限制線程總數

是越來越封頂當我做threadJoin我只得到38 100

// thread http calls 
pages = 100; 

for (page="1";page <= pages; page++) { 

    thread name="req#page#" { 

     grabber.setURL('http://site.com/search.htm'); 
     // request headers 
     grabber.addParam(type="url",name="page",value="#page#"); 
     results = grabber.send().getPrefix(); 

     arrayAppend(VARIABLES.arrResults,results.fileContent); 
    } 
} 

// rejoin threads 
for (page="2";page <= pages; page++) { 
    threadJoin('req#page#',10000); 
} 

CF可以創建的線程數是否有限制?它與Java在後臺運行有關嗎?或者它不能處理那麼多的http請求?

有沒有比線程HTTP調用更好的方式來做到這一點?

回答

6

您看到的結果可能是因爲您的變量不是線程安全的。

grabber.addParam(type="url",name="page",value="#page#"); 

該行正在訪問Variables.Page,該行被所有派生線程共享。由於線程在不同的時間開始,因此page的值通常與您認爲的值不同。這將導致多個線程具有相同的值page。相反,如果您將page作爲屬性傳遞給線程,則每個線程都將擁有其自己的變量版本,並且最終將以100個唯一值結束。 (1-100)。

此外,您還寫入共享變量。

arrayAppend(VARIABLES.arrResults,results.fileContent); 

ArrayAppend不是線程安全的,你會覆蓋的VARIABLES.arrResults版本與自身的其它版本,而不是附加的每一位。

您想要將結果設置爲thread變量,然後在完成連接後訪問該變量。

thread name="req#page#" page=Variables.page { 

    grabber.setURL('http://site.com/search.htm'); 
    // request headers 
    grabber.addParam(type="url",name="page",value="#Attributes.page#"); 
    results = grabber.send().getPrefix(); 

    thread.Result = results.fileContent; 
} 

和連接:

// rejoin threads 
for (page="2";page <= pages; page++) { 
    threadJoin('req#page#',10000); 
    arrayAppend(VARIABLES.arrResults, CFThread['req#page#'].Result); 
} 
+0

範圍似乎是問題。我還將** grabber **和**結果**變量的範圍限定爲** thread.grabber **和** thread.results **,我得到了重複的結果,直到我做到了。 –

0

在Request Tuning選項卡下的ColdFusion Administrator中檢查您的Maximum number of running JRun threads設置。缺省值是50.

+0

它被設置爲50,但我猜想它會是壞的,只是繼續推動這件事。當然,任何額外的線程只是排隊,「排隊JRun線程的最大數量」設置爲1000 –

3

在ColdFusion管理員中,有多少個同時運行的設置,我的默認值是10.其餘的顯然是排隊的。 Phantom42提到,你可以增加運行的CF線程的數量,但是,如果有100或更多的線程,你可能會遇到其他問題。

在32位進程上,您的整個進程只能使用2g內存。每個線程使用了一定數量的堆棧內存,這不是堆的一部分。由於Java Binary + Heap + Non-Heap(PermGen)+(threads * 512k)可以輕鬆超過2gig的限制,所以我們遇到了大量線程內存不足的問題。

您還必須允許足夠的線程來處理上面的代碼,以及其他請求進入您的應用程序,這可能會導致整個應用程序崩潰。

我會建議改變你的代碼來創建N個線程,每個線程做多個請求。這是更多的工作,但你打破N個請求= N線程問題。有一對夫婦的方法可以採取:

  • 如果你認爲每個請求將大致採取相同的時間,那麼你可以分割的工作,並給每個線程的部分,然後再開始工作的每一個起來。

  • 或者每個線程從列表中選取一個URL並對其進行處理,然後您可以加入所有N個線程。您需要確保將鎖定在任何用於跟蹤進度的計數器上。