0

数千のレコードを実行するループがあり、ヒットするレコードごとに、サーバー上で画像のサイズ変更と操作が行われます。プロセスは小さなレコードセットでのテストではうまく実行されますが、ライブサーバーに移動したら、50レコード後にプロセスを一時停止して再開し、サーバーのパフォーマンスが低下したり、完全に終了したりしないようにします。

コードは次のようになります。

<cfloop query="imageRecords">
    <!--create and save images to server - sometimes 3 - 7 images for each record -->
</cfloop>

私が言ったように、私は50のレコードの後で一時停止し、それからそれが中断したところから再開したいと思います。私は見ましcfscheduleたが、これにどのように取り組むかがわかりませんでした。

sleep()関数も調べましたが、ドキュメントではcfthreadタグ内でのこれの使用について説明しています。他の人は、長いプロセスをシミュレートするためにそれを使用することについて投稿しました。

ですから、sleep()必要な方法で安全に使用できるかどうかはわかりません。

サーバーはCF9で、dbはMySQLです。

4

2 に答える 2

3

データベースでworkedという列を作成します。デフォルトは0で、画像が更新されたらフラグを1に設定します。クエリは次のようになります。

SELECT TOP 50 imagename
FROM images
WHERE worked = 0

次に、x分ごとに実行するようにCFスケジュールタスクを設定します

于 2012-08-16T16:19:30.850 に答える
0

これは、おそらく他のアプローチと組み合わせることができる別のアプローチです。

<cfscript>
th=CreateObject("java","java.lang.Thread");
th.setPriority(th.MIN_PRIORITY);
// Your work here
th.setPriority(th.NORM_PRIORITY);
</cfscript>

これにより、他のリクエストを処理している他のスレッドよりも優先度が低くなるようにスレッドを設定する必要があります。理論的には、作業は最短時間で完了しますが、他のユーザーへの影響は少なくなります。私はまだこれをテストする機会がなかったので、あなたのマイレージは変わるかもしれません。

于 2012-08-16T20:37:48.833 に答える