このコードをチュートリアルからコピーしました。新しい TCP 接続が確立されるたびに、新しいスレッドが開始されます。
require 'socket' # Get sockets from stdlib
server = TCPServer.open(2000) # Socket to listen on port 2000
loop { # Servers run forever
Thread.start(server.accept) do |client|
client.puts(Time.now.ctime) # Send the time to the client
client.puts "Closing the connection. Bye!"
client.close # Disconnect from the client
end
}
うまく機能していますが、タイムアウトの場合はスレッドを終了したいと思います。abort_on_exception
これを行うには、スレッドを終了する必要があります (デバッグを容易にするために有効にする必要があるため、例外をスローすることはできません) が、スレッド ハンドルを取得する方法がわかりません。
ループで次のようなことができるはずだと思います:
Thread.start(server.accept) do |client, myThread|
begin
Timeout::timeout(1) do
#important stuff
end
rescue Timeout::Error
client.puts "Timeout"
client.close
myThread.terminate
end
end
myThread.terminate
また、メインプロセスを強制終了するexit
ため(完全には理解できない理由で)、最後のスレッドが終了したためにサーバーの実行を停止したくないため、に置き換えることもできません。