Depuis quelque temps j'utilise une ancienne distribution Ruby (je pense que c'était 1.8.6) sur laquelle j'ai codé avec la bibliothèque de socket. L'ancienne bibliothèque avait une méthode appelée prête?, qui vérifiait s'il restait des données à recevoir sans blocage. Quel serait le meilleur remplacement pour cela dans 1.9?Remplacement en 1.9 pour Socket prêt? méthode
La raison pour laquelle je le redemanderai est que j'ai un programme structuré comme celui-ci:
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
(je puis une autre boucle qui maintient l'exécution de la méthode handle_socket_messages et utilise ensuite un sommeil, de sorte que la boucle doesn Ne pas tourner trop vite, ainsi que d'autres méthodes
Comme vous pouvez le voir, je dois vérifier si je vais recevoir des données en utilisant @ s.ready? (@s est une socket), sinon les boucles se bloquer à readStr = @ s.recv (0x1024), où le socket conserve w anting pour recevoir des données que le serveur n'envoie pas (il attend des données quand il ne devrait pas).
Quel serait le meilleur remplacement pour cette méthode?
Peut-être que ['Kernel # select'] (http://ruby-doc.org/core/classes/Kernel.html#M001406) qui est juste un wrapper pour l'appel système ['select'] (http://www.kernel.org/doc/man-pages/online/pages/man2/select.2.html). Une [recherche SO] (http://stackoverflow.com/search?q=%5Bruby%5D+select+socket) devrait vous donner un aperçu rapide. –
Merci, j'ai été en mesure de le réparer: pas IO.select ([self], nil, nil, 0) == nil – Speed
La documentation 'IO.select' est plutôt, um, éparse. Pas étonnant que tu ne le saches pas. –