2011-07-29 5 views
0

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?

+1

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. –

+0

Merci, j'ai été en mesure de le réparer: pas IO.select ([self], nil, nil, 0) == nil – Speed

+0

La documentation 'IO.select' est plutôt, um, éparse. Pas étonnant que tu ne le saches pas. –

Répondre

0

La solution était:

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

N'importe quelle idée quels sont les compromis entre l'appel 'IO.select' et la méthode' #ready? 'De la bibliothèque standard' io/wait'? J'ai lu la source pour les deux sans aucune illumination. – slothbear

Questions connexes