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

标签 ruby networking

我在 Ruby 中实现了一个小型客户端服务器应用程序,但遇到以下问题:服务器在新线程中为每个连接的客户端启动一个新的客户端 session ,但应该可以关闭服务器并停止所有客户端 session 以一种“礼貌”的方式从外面而不是杀死线程,而我不知道它处于哪种状态。

所以我决定客户端 session 对象获得一个可以从外部设置的“停止”标志,并在每次操作之前进行检查。问题是它不应该等待客户端,如果它只是在等待一个请求。我有以下临时解决方案:

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

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

最佳答案

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

关于ruby - 从外部停止套接字读取操作的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673837/

相关文章:

Ruby 检查电子邮件地址

ruby-on-rails - 使用 Roo 和 Ruby(Rails) 解析 Excel

ruby - 如何获取由Base64编码字符串创建的图像中显示的值?

php - PHP 7.0.11 中的 BUG,FILTER_FLAG_NO_RES_RANGE

ruby - 在 Amazon EC2 上运行 Sinatra 应用程序

ruby-on-rails - Ruby 数组的换行符

mysql - 端口是如何工作的?

c - C 的网络库

bash - 从列表或镜像中找到最快的镜像

Java并发网络问题