1

環境

  • Ruby で時間のかかるテキスト処理を行うアプリがあります。
  • ユーザーがテキストを送信すると、そのテキストを処理するためにバックグラウンド プロセスがフォークされます。
  • このプロセスは、処理されたテキストの新しい部分を継続的に出力します。
  • その間、ユーザーは処理されたテキストが出力されるページにリダイレクトされます。

私の質問は次のとおりです。PID が与えられた場合、クライアントの Javascript はサーバー上で実行されているプロセスとどのように通信できますか? それは可能ですか?それぞれのバックグラウンド プロセスを、独自のポートで実行されている独自のサーブレット内にラップする必要がありますか?

4

4 に答える 4

2

プロセススペースにアクセスできません。これを行うには、HTTPインターフェースが必要です。これを行うには、長いポーリングを使用できます。サーバーは定期的にテキストを出力でき、クライアント側のスクリプトはテキストを長時間ポーリングできます。

ここでロングポーリングの例を確認してください: 基本的な「ロングポーリング」を実装するにはどうすればよいですか?

于 2012-04-15T18:02:00.127 に答える
2

WebSocketの使用を検討してください。私のZendアプリケーションでは、JSにパケットを送信するプロキシスクリプトを作成しました。もう1つのアプローチは、プロセスが終了したかどうかをx秒ごとにhttpサーバーに問い合わせるsetTimeoutを作成することです。

于 2012-04-15T18:02:34.313 に答える
1

最も簡単な方法は、PusherまたはPubNubなどを使用することです。これにより、PIDを含むチャネルにコードをプッシュでき、クライアントは同じチャネルにサブスクライブできます。このように、HTTPアプリを設定する必要はありません。

于 2012-04-15T18:05:01.457 に答える
1

これが私が最終的に使用した戦略です:

  • さまざまなジョブを管理する小さな Sinatra サーブレットを作成します。
  • 受信した各ジョブ リクエストにはジョブ ID が割り当てられ、切り離された fork プロセスで開始されます。
  • フォークされたプロセスは、スタックとして使用されるアレイを使用して DRb サービスをセットアップします。
  • 次に、ジョブ ID を DRb URI に関連付けるサーブレットで「GET」要求を実行します。
  • プロセスがバックグラウンドで実行を続けると、要素がスタックに追加されます。
  • メイン スレッドをポーリングして、スタック内の次の要素を返すことができます。
    • リモート配列への接続がサーブレット内で確立され、要素がスタックからシフトされます。
    • ポーリングは、スタックに追加する要素がなくなり、クライアントに返す要素がなくなるまで続行されます。
  • スタックが空になると、プロセスは終了します。

何かご意見は?

于 2012-04-17T04:52:16.373 に答える