2012-03-08 28 views
2

我有一個鏈接,將允許用戶點擊它,它會獲取照片的zip文件。如果該zip文件不存在,則它會啓動一個線程來創建該zip文件,並向用戶顯示一條消息,指出該照片當前正在處理中。ColdFusion性能和鎖定優化

我試圖避免的是用戶反覆點擊鏈接,並設置了大量的線程,將嘗試創建/更新zip文件。壓縮文件處理是相當系統資源密集型的,所以我只想讓應用程序一次生成一個壓縮文件。如果一個人忙於編譯,它應該什麼也不做,並排隊請求。

目前我是怎麼處理它與螺紋圍繞CFLOCK:

<cflock name="createAlbumZip" type="exclusive" timeout="30" throwontimeout="no"> 
    <cfthread action="run" albumId="#arguments.albumId#" name="#CreateUUID()#"> 
    .... 

什麼我希望在這裏發生(這似乎是工作,如果我測試它)是,它會檢查是否有目前是使用名爲'createAlbumZip'的鎖運行的線程。如果有,它會將請求排隊30秒,之後它應該超時而沒有任何錯誤。如果它無法在30秒內完成創建。

所以 - 這似乎是工作,但我的問題是:這是處理這種情況的最佳方式?鎖定正確的方法?我沒有看到這種方法可能產生的缺點嗎?

回答

2

有一百萬種方法來剝皮這隻貓。鎖定是一個好的開始,根據您對@Pat Branley的回答的評論,我認爲您創建線程之外的鎖定可能會更有效一些,因爲您提出的理由是:創建數十個線程的潛力將會存在,這些線程的整個生命週期將包括等待鎖打開或超時。

你需要做的另一件事是在IF語句翻倍:

<cfif not (zip file exists)> 
    <cflock ...> 
    <cfif not (zip file exists)> 
     <cfthread> 
     ...create zip... 
     </cfthread> 
    </cfif> 
    </cflock> 
</cfif> 

這將防止在那裏,而線程A創建ZIP線程B等待的情況,然後線程A結束,並且線程B繼續重新創建/覆蓋它。

此外,您可以考慮使用JavaScript來阻止額外的點擊,方法是在點擊按鈕後禁用按鈕/鏈接。

0

我想你有錯誤的方式代碼。你所說的是'只有一個線程可以產生這個新線程'。現在這可能適用於你的情況,因爲你設置了超時設置,這樣任何人都不能創建另一個線程,所以兩個線程都不會一次執行。

你想說的是'只允許一個線程進行壓縮'。所以我會這樣做

<cfthread .... > 
    <cflock> 
    ...zip.... 
+0

因此,如果用戶多次點擊鏈接(比方說100)來生成zip,是不是會創建100個線程,如果是的話,那麼效率如何? – Cheeky 2012-03-09 10:33:13