2012-03-08 18 views
2

ユーザーがクリックできるようにするリンクがあり、写真のZIPファイルを取得します。 zipファイルが存在しない場合は、スレッドを開始してzipを作成し、写真が現在処理中であることをユーザーに示すメッセージを表示します。ColdFusionのパフォーマンスとロックの最適化

私が避けようとしているのは、ユーザーがリンクを繰り返しクリックし、zipファイルの作成/更新を試みる大量のスレッドを設定することです。 zipファイルの処理はシステムリソースを大量に消費するので、アプリケーションが一度に1つの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が待っている場合を防止し、その後、仕上げをスレッドになり、スレッドBはそれを再作成/上書きします。

さらに、クリックした後にボタン/リンクを無効にすることで余分なクリックを防ぐためにJavaScriptを使用するようなことも考えられます。

0

私はあなたが間違った方法でそのコードを持っていると思います。あなたが言っているのは、「このスレッドをスポーンするのは1つのスレッドだけです」ということです。今度は、誰も別のスレッドを作成できないようにタイムアウトを設定しているので、2つのスレッドが同時に実行されることはないので、あなたのケースではうまくいくかもしれません。

あなたは「1つのスレッドだけがジップを作ることが許可されています」と言っています。だから私はこれをするだろう

+0

したがって、ユーザーがリンクを複数回クリックすると(100としましょう)、ジップを生成しますが、100スレッドを作成しません。その場合、効率はどれくらいですか? – Cheeky

関連する問題