0

Java をフロント エンドとして、シェル スクリプトをバック エンドとして持つ Web アプリケーションを実行しています。コンセプトは、バックエンドで複数のファイルを処理する必要があるということです。ユーザーから日付範囲 (たとえば、7 月 1 日から 8 日まで) を取得し、毎日約 100 ファイルを処理します。したがって、合計で 800 個のファイルを処理する必要があります。

これらの詳細を JSP から取得し、バックグラウンド呼び出しをシェル スクリプトに委譲し、結果を取得してユーザーに表示します。

ここで、これらすべてをシーケンシャル アプローチで実行しました。つまり、スレッドを使用しません。したがって、実行されるメイン スレッドは 1 つだけであり、ユーザーは 800 個のファイルが順次処理されるまで待たなければなりません。しかし、これは本当に遅いです。このため、私はスレッドに行くことを考えています。私はスレッドの初心者なので、これに関するいくつかの資料を読み、次のアイデアを思いつきました:

スレッドの作業を分割する必要があると読んだとき.. 8 日間の作業を 4 つのスレッドに分割し、各スレッドが 2 日間の作業を実行することを考えました。


私が正しいアプローチに従っているかどうかを知りたいのですが、私の主な懸念事項は次のとおりです。

  1. Web アプリケーションから複数のスレッドを生成することをお勧めしますか?
  2. これが良いアプローチかどうか

これをどのように進めるかについてのいくつかのガイダンス。例のインスタンスは素晴らしいでしょう。ありがとうございました。

4

4 に答える 4

0
  1. はい、Webアプリケーションから複数のスレッドを生成しても問題はありません。実際、サーブレットコンテナを実行している場合(Javaを使用しているためである可能性が高い)、すでに複数のスレッドが生成されています。一般に、サーブレットコンテナは、受信した各リクエストを処理するために、新しいスレッドを自動的に生成します(またはプールからスレッドを再利用します)。

  2. システムのハードウェア構成とWebサービスの同時負荷の量を考慮して、スレッドの数を適切なものに微調整することをお勧めします。また、多数のスレッドをスピンアップすると、すべてのデータを処理するために必要な合計時間が短縮されますが、データがユーザーに戻る準備ができるまでに、かなりの時間がかかる可能性があることにも注意してください。したがって、小さな作業単位を順番に実行し、結果の各バッチを準備ができたらすぐにユーザーインターフェイスに投稿することで、より良い結果が得られる可能性があります。その後、ユーザーがすべてのデータを取得するのにまだ長い時間がかかりますが、それによってデータの少なくとも一部がほぼすぐに表示され始める可能性があります。

于 2012-07-10T07:23:17.693 に答える
0

ユーザーエクスペリエンスを向上させる方法は、100000スレッドでサーブレットレベルで並列化することではなく、ビューのインクリメンタルレンダリングを提供することです。まず、MVCパターンなどに従って、アプリケーションを複数のレイヤーに分割すると便利です。

そうは言っても、あなたはどのように見なければならないでしょう

  • 部分的な回答と最後の回答を返すことができるサービスを作成します。これは、使用可能なすべてのデータが返されることを意味します。この回答はそれぞれ、パフォーマンスを向上させるために並行して計算できます。

  • DOMにデータを追加するために使用するJSON文字列を返すこのサービスをコールバックすることにより、Webページを段階的に埋めます。回答を得るたびに、これが部分的な回答である場合は、前のシーケンス番号を提供するサービスを再度呼び出します。

Liligoを見て理解すると、これがどのように機能するかがわかります。私が説明した手法はポーリングとして知られていますが、UIレベルで同様の非同期結果を取得する手法は他にもあります。一般に、非常に低レベルのAPIであるサーブレットAPIを直接操作するのではなく、適切なフレームワークまたは抽象化を使用します。

温かいアドバイスが必要な場合は、Playをご覧ください。フレームワークhttp://www.playframework.org/documentation/2.0.2/JavaStreamHTTPストリーミング。

于 2012-07-10T08:44:40.000 に答える
0

Webアプリケーションでスレッドを作成することは良い解決策ではありません。通常、そのアクティビティを担当するのはコンテナ(Webサーバー)であるため、これは悪い設計です。だから私はあなたが別の解決策を見つけなければならないと思います。

シェルスクリプトをcronに入れて、毎分実行するようにスケジュールし、それらを「アクティブ化」するために、セマフォとして機能するファイルに触れることをお勧めします。スクリプトを実行するたびに、Webアプリケーションがセマフォファイルにアクセスしたかどうかを確認します。タッチした場合は、それらのファイルから日付間隔を読み取り、処理を開始します。

于 2012-07-10T07:26:43.653 に答える
0

はい、マルチスレッドまたは任意の高パフォーマンス環境で長時間処理ジョブを実行できます。また、Servlet 3.0 Asynchronous Request Processing を使用して、リクエスト スレッドを一時停止し、長い処理タスクが完了するまで待機する必要があります。

于 2012-07-10T06:55:07.093 に答える