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が必要かどうか)です。