我在 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 标志)。