0

このコードをチュートリアルからコピーしました。新しい 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ため(完全には理解できない理由で)、最後のスレッドが終了したためにサーバーの実行を停止したくないため、に置き換えることもできません。

4

1 に答える 1

1

Thread.current.terminateを探しています

于 2013-09-04T03:14:29.863 に答える