1

少しの解析を行う長くて複雑なコードがあり、処理に時間がかかります。この場合、コードを最適化してもあまり意味がありません。

長い実行時間を処理し、完了したことをユーザーに知らせるための戦略は何ですか?


最適化があまり意味をなさない理由の説明

アプリケーションには、エンド ユーザー向けのページと非エンド ユーザー向けのページがあります。非ユーザー向けの領域では、いくつかの Excel スプレッドシートを解析しています。これらのロードとループには長い時間がかかります。タイムアウト制限内で実行するようにコードを最適化すると、今日は機能する可能性がありますが、1 か月後には 4 倍の長さのファイルをインポートすることになり、再び機能しなくなる可能性があります。私が解決しようとしている問題は、時間がかかることがわかっている特定の操作の cf タイムアウトを回避することです。

スレッドを使用してみましたが、何らかの理由で CF9 では機能しましたが、CF8 では機能しませんでした (ただし、サポートされています)。

cfsetting requestTimeOutまた、私がする必要があることを実行できる可能性のあるものについても知りました。

4

5 に答える 5

3

数年前、同様の問題を抱えたレガシーシステムがありました。

フォーム投稿では、次の 2 つのことを行いました。

  1. CFTHREAD処理を処理するためにa を開始しました。

  2. データベース フィールドを更新して、ジョブが処理中であることをアプリケーションに知らせました。

そうすれば、ページが表示され、そのデータベース フィールド (または、必要に応じてアプリケーション変数) が設定されるたびにtrue、「後で確認してください。リクエストは処理中です」などのメッセージが表示されることがわかっていました。

CFTHREAD終了したら、DB フィールドを に更新するfalseと、ページは通常の状態に戻ります。振り返ってみると、アプリケーション変数の方が優れたソリューションでした。CF がクラッシュまたは再起動した場合、DB が実行中のプロセスを誤って報告することはありません。

于 2012-12-10T14:58:40.907 に答える
2

すでに調べたことがあるかもしれませんが、待機時間を短縮するために何かをキャッシュできるかどうかを確認してください。

それをユーザーに伝えることに関しては、まず、ユーザーがいつ何が起こっているかを知っていることを確認してください。プログラムができる最悪のことの 1 つは、入力を受け取っても反応しないことです。何かが起こっているときにユーザーが十分に認識していることを確認してください。負荷を表示する方法はあなた次第です。読み込み時間が約 10 秒程度未満の場合は、砂時計のようなものが表示される可能性がありますが、待機時間がそれより長い場合は、プログレス バーまたは同様のものが必要になる可能性があります。

その一部をバックグラウンドまたは他のプロセスで実行できるようにする方法があれば、負荷を軽減するのに役立ちます。それ以外の場合は、コーヒーを飲みに行くようにという提案をポップアップ表示します。:)

これはほんの少しの情報しかないひねくれた応答ですが、探しているものと大まかな読み込み時間の見積もりについてより多くのアイデアを提供できれば、より具体的になるかもしれません.

于 2012-12-07T19:22:30.867 に答える
1

アプローチ1

II6 と CF 7 のサイトを持っていました。Javascript で操作したこの棒グラフを追加しました。次に、Javascript を使用してグラフの長さを設定し、その後に<cfflush>.

サイトが II7.5 と CF 9 にアップグレードされるまではうまく機能していました。何らかの理由<cfflush>で機能しませんが、Javascript は依然としてバーを設定し、有意義な進歩をもたらすことができます。

アプローチ 2

これには 2 つの iframe が必要です。

  • 1 つの iframe が長時間実行されるプロセスを実行し、ユーザー ビューから隠されます。

  • もう 1 つの iframe は、約 10 秒ごとに更新されるページを実行します。このページは、遅いプロセスのバックエンド ログを照会します。10 秒遅れるかもしれませんが、エンド ユーザーは気付くかもしれません。

アプローチ 3

アプローチ 2 と同じことを行いますが、AJAX を使用します

于 2012-12-07T20:10:47.000 に答える
1

タイムアウトの延長を検討している他の人のために、Ben Nadel が「cfsetting requestTimeOut」に関する良い投稿をしています。

http://www.bennadel.com/blog/626-CFSetting-RequestTimeout-Updates-Timeouts-It-Does-Not-Set-Them.htm

これは通知の問題を解決しませんが、完了するとページがレンダリングされるため、私の問題は解決します

複数のタイムアウト レベルを設定するサンプル コード

<!--- Set the current time out to be 3 seconds. --->
<cfsetting requesttimeout="3" />

<!---
    Get the millisecond start time for page processing
    (so that later on, we can check to see how long
    the page ran overall).
--->
<cfset intStart = GetTickCount() />


<!--- Try to kill some time. --->
<cftry>

    <!---
        Here, we are killing time - 4 seconds to be
        approximate. This will exceed the request time
        out set above (3 seconds) and will throw an error.
    --->
    <cfset KillTime( 4000 ) />


    <!--- The KillTime() method call has timed out. --->
    <cfcatch>

        First Timeout!<br />

        <!---
            In an attempt to "recover" from this time out,
            update the request time out to be six seconds.
        --->
        <cfsetting requesttimeout="6" />


        <!--- Try to kill some more time. --->
        <cftry>

            <!---
                We are going to try and kill about four
                seconds. If this is in terms of the six-second
                timeout set above, this should NOT timeout.
                However, if this is in the context of the
                overall page time (including previous kill time
                calls), then this will timeout.
            --->
            <cfset KillTime( 4000 ) />


            <!--- The KillTime() method has timed out. --->
            <cfcatch>

                Second Timeout!<br />

            </cfcatch>
        </cftry>

    </cfcatch>

</cftry>
于 2012-12-13T17:25:53.807 に答える
1

もう 1 つの方法は、ページを次のように開始することです。

<div id="displayarea">
display something here
</div>
<cfflush>

次に、必要な処理を行います。それが終わったら、このようなことをしてください。

<cfsavecontent variable = "newdisplay_cf>
generate html here
</cfsavecontent>

<script>
<cfoutput>
var #toScript(newdisplay_cf, "newdisplay_js")#
</cfoutput>
document.getElementById("displayarea").value = newdisplay_js;
</script>

ここにいくつかの構文エラーがあるかもしれません。コードをテキストエリアに入力しただけです。

于 2012-12-08T17:15:56.033 に答える