Я работаю над созданием пользовательского клиента поверх Ruby's SSLSocket
. Чтобы получать данные, я использовал методы read
и read_nonblock
, предоставляемые модулем OpenSSL::Buffering
.Есть ли способ получать уведомления о появлении новых данных в SSLSocket (Ruby)?
Теперь я пытаюсь взять то, что у меня есть, и сделать так, чтобы я мог определить обратный вызов (через определенный пользователем блок), который будет запускаться при получении сообщений. Похоже, что я в принципе нужно реализовать что-то в одиночку эти строки:
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
У меня проблема такого подхода заключается в том, что это на самом деле не событийного, и может быть до 100ms задержки, поскольку данные фактически доступный. Конечно, я мог бы изменить время сна, но он просто чувствует себя немного взломанным.
Есть ли лучший подход, который я мог бы использовать для этого? Если нет, то что я должен решить, должен ли я решить реализовать более короткий/более быстрый цикл (например: sleep 0.01
)?
ОК, во-первых, если вы его отключили, почему вы остановились на неблокировании? –
@MartinJames - Мое предположение заключалось в том, что если я выберу вызов сна, это закончится тем, что просто купит память в этом цикле. Возможно, у меня все еще не получается. –
Вы посмотрели на метод «Kernel.select»? [Https://github.com/celluloid/nio4r] использует этот подход для чистой реализации Ruby. –