从外部停止套接字读取操作的优雅方式

时间:2012-10-01 13:02:42

标签: ruby networking

我在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

但是这很糟糕,看起来非常可怕和直觉,这应该是一个正常的事情,必须有一个“正常的”#39;解决它。我甚至不知道它是否安全,或者是否可能发生获取操作读取客户端请求的一部分,但不是全部。 另一个问题是,如果设置/获取布尔标志是Ruby中的原子操作(或者如果我需要额外的Mutex用于标志)。

1 个答案:

答案 0 :(得分:2)

每个客户端线程方法通常是服务器设计的灾难。如果没有特定于操作系统的技巧,阻塞I / O也很难中断。查看非阻塞套接字,例如,参见this question的答案。