0

私たちの Web アプリケーションでは、http リクエストごとに、バックエンドで多くの計算が行われます。出力は 10 秒から 1 時間までさまざまです。それが計算されるまでの間に、「待機中..」が各ユーザーの Web サイトに表示されます。

しかし、ユーザーが途中でサービスを切り詰める可能性があります。では、リソースを節約するために途中で計算を停止できるように、バックエンドで何ができるでしょうか? ここで適用できるさまざまな戦術は何ですか?

そして、(スレッドを直接強制終了するのではなく) より良い場合は、適切な終了ポリシーが驚くべきものになるはずです。

4

1 に答える 1

1

これがあなたのシナリオに当てはまるかどうかはわかりませんが、過去にこの問題に取り組んだ方法は次のとおりです。Web アプリの PDF レポートを生成していました。ほとんどのレポートは 5 秒以内に生成できますが、最大 1 時間かかるものもあります。

ユーザーが生成ボタンをクリックすると、一種のプログレス バーと [キャンセル] ボタンがある [生成中...] ダイアログ画面にリダイレクトされます。これにより、サーバー上の生成プロセスも別のスレッドで起動されます (ワーカー プールがあります)。次に、ブラウザは ajax を介して定期的にサーバーをポーリングし、進行状況を確認します (進行状況バーを更新するか、終了時に表示ページにリダイレクトします)。

生成プロセスと ajax プロセス間のサーバーでの同期は、プロセス同期オブジェクトを介して行われました。sync-obj は非常に単純なクラス インスタンスであり、一意の文字列を介していつでも任意のスレッドからすばやく取得できます。

両方のプロセスが、この共有同期オブジェクトを更新できます。レポートが生成されると、repgen スレッドは、ajax スレッドがブラウザーに通知する sync-obj を更新します。ユーザーが [キャンセル] ボタンをクリックすると、ajax スレッドが sync-ob に「キャンセル」フラグを設定し、repgen スレッドがそれを取得して生成ループから抜け出します。

明らかに、プロセス全体の応答性は、repgen スレッドが sync-obj をチェックする頻度に大きく依存し、多くの場合、個々のレポートがどのようにコーディングされたかに依存します。

最後に、あなたの質問に答えるために、ユーザーが退屈して「戻って」生成ボタンを再度クリックした場合、最初のレポートをキャンセルして 2 番目のレポートを開始するのではなく、それが同じレポート (および同じ sync-obj) であることを認識します。 id) ということで、レポートを続けます。ただし、それがシナリオに合わない場合、生成プロセスを開始すると、ユーザーが [キャンセル] ボタンを使用するのと同じ方法で最初のプロセスをキャンセルできます。

于 2012-09-13T06:38:09.053 に答える