我正在构建一个基于 Ruby 的自定义客户端SSLSocket
。为了接收数据,我一直在使用模块提供的read
和read_nonblock
方法。OpenSSL::Buffering
我现在正在尝试采用我目前所拥有的东西,并使其能够定义一个回调(通过用户定义的块),该回调将在收到消息时运行。看起来我基本上需要单独实现这些行:
thread = Thread.new do
while !socket.closed?
while (data = socket.read_nonblock(1024) rescue nil)
@buffer << data
end
sleep 0.1
# ... parse full messages from @buffer & deliver to callbacks ...
end
end
thread.run
我对这种方法的问题是它不是真正的事件驱动的,并且由于数据实际可用,可能会有长达 100 毫秒的延迟。当然,我可以改变睡眠时间,但它只是感觉有点骇人听闻。
我可以为此使用更好的方法吗?如果没有,我应该决定实施更短/更快的循环(例如:),我应该有什么顾虑sleep 0.01
?