Замена в 1.9 для сокета готова?метод - PullRequest
0 голосов
/ 29 июля 2011

В течение некоторого времени я использовал старый дистрибутив Ruby (кажется, это был 1.8.6), в котором я кодировал библиотеку сокетов.В старой библиотеке был метод с именем ready? , который проверял, есть ли еще данные для получения без блокировки.Какова была бы лучшая замена для этого в 1.9?

Причина, по которой мне это нужно, заключается в том, что у меня есть программа, структурированная так:

def handle_socket_messages
    while true
        break unless messages_to_send
        sent_messages
    end
    while @s and @s.ready?
        #read messages
        readStr = @s.recv(0x1024)
        ...
    end
end

(тогда у меня есть другой цикл, который сохраняетвыполнение метода handle_socket_messages, а затем использование спящего режима, чтобы цикл не вращался слишком быстро вместе с некоторыми другими методами.

Как видите, мне нужно проверить, получу ли я данные, используя @s.ready? (@s - это сокет), в противном случае циклы висят в readStr = @ s.recv (0x1024) , где сокет продолжает получать данные, которые сервер не делает.не отправлять (он ожидает данные, а не должен).

Какая из них лучше всего подойдет для этого метода?

Ответы [ 2 ]

0 голосов
/ 01 мая 2015

Я успешно использовал метод ready? в Ruby 2.2.2, требуя io/wait.В этом SO ответе немного больше информации: https://stackoverflow.com/a/3983850/2464

0 голосов
/ 30 июля 2011

Решение было:

class Socket
    def ready
        not IO.select([self], nil, nil, 0) == nil
    end
end
...