3

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

但这很糟糕,看起来很糟糕而且直观,这应该是一件很正常的事情,必须有一个“正常”的解决方案。我什至不知道它是否安全,或者 get 操作是否会读取客户端请求的一部分,但不是全部。另一个问题是,如果设置/获取布尔标志是 Ruby 中的原子操作(或者如果我需要一个额外的 Mutex 标志)。

4

1 回答 1

2

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

于 2012-10-01T13:34:08.470 回答