3

Rubyで小さなクライアントサーバーアプリケーションを実装しましたが、次の問題があります。サーバーは接続しているクライアントごとに新しいスレッドで新しいクライアントセッションを開始しますが、サーバーをシャットダウンしてすべてのクライアントセッションを停止することは可能です。スレッドがどの状態にあるかわからないときに、スレッドを強制終了することなく、外部から丁寧に処理します。

そこで、クライアントセッションオブジェクトが外部から設定できる「停止」フラグを取得し、各アクションの前にチェックすることにしました。問題は、クライアントがリクエストを待っているだけの場合、クライアントを待つべきではないということです。私は次の一時的な解決策を持っています:

def read_client
  loop do
    begin 
      timeout(1) { return @client.gets }
    rescue Timeout::Error
      if @stop
        stop # Notifies the client and closes the connection
        return nil
      end
    end
  end
end

しかし、それはひどく、ひどく、直感的に見えます。これは非常に正常なことであるため、「通常の」解決策が必要です。安全かどうか、またはgets操作がクライアント要求の一部を読み取る可能性があるかどうかさえわかりませんが、すべてではありません。もう1つの副次的な質問は、ブールフラグの設定/取得がRubyでの不可分操作であるかどうか(またはフラグに追加のMutexが必要かどうか)です。

4

1 に答える 1

2

クライアントごとのスレッドのアプローチは、通常、サーバー設計にとって災害です。また、I / Oのブロックは、OS固有のトリックなしでは中断するのが困難です。ノンブロッキングソケットをチェックしてください。たとえば、この質問への回答を参照してください。

于 2012-10-01T13:34:08.470 に答える