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