超时时终止服务器线程

时间:2013-09-03 11:17:43

标签: ruby multithreading

我从教程中复制了这段代码。每次建立新的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,因为这会导致我的主进程被终止(由于我不完全理解的原因)并且我不希望服务器因为最后一次而停止运行线程终止。

1 个答案:

答案 0 :(得分:1)

您正在寻找Thread.current.terminate