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
ますか?