Comment définir le délai d'attente pour les opérations de blocage sur une socket Ruby?Comment définir le délai d'attente de socket dans Ruby?
Répondre
La solution que je trouve qui semble fonctionner est d'utiliser Timeout::timeout:
require 'timeout'
...
begin
timeout(5) do
message, client_address = some_socket.recvfrom(1024)
end
rescue Timeout::Error
puts "Timed out!"
end
L'utilisation du délai d'attente est une erreur. En raison des theards verts, tout ce qui bloque sur IO bloquera également le thread du timeout, l'empêchant ainsi de fonctionner. – Sardathrion
@Sardathrion, merci pour les commentaires, mais une solution serait mieux qu'un commentaire négatif :) – Mike
Les fils de rubis sont cassés j'ai peur. Trouver une meilleure langue - dure mais vraie. – Sardathrion
L'objet de délai d'attente est une bonne solution.
Voici un exemple d'E/S asynchrones (non-bloquant dans la nature et se produit de manière asynchrone à le flux de l'application.)
IO.select(read_array
[, write_array
[, error_array
[, timeout]]]) => array or nil
Peut être utilisé pour obtenir le même effet.
require 'socket'
strmSock1 = TCPSocket::new("www.dn.se", 80)
strmSock2 = TCPSocket::new("www.svd.se", 80)
# Block until one or more events are received
#result = select([strmSock1, strmSock2, STDIN], nil, nil)
timeout=5
timeout=100
result = select([strmSock1, strmSock2], nil, nil,timeout)
puts result.inspect
if result
for inp in result[0]
if inp == strmSock1 then
# data avail on strmSock1
puts "data avail on strmSock1"
elsif inp == strmSock2 then
# data avail on strmSock2
puts "data avail on strmSock2"
elsif inp == STDIN
# data avail on STDIN
puts "data avail on STDIN"
end
end
end
Je pense que l'approche non bloquante est la voie à suivre.
J'ai essayé l'article mentionné ci-dessus et je pouvais toujours l'accrocher.
cet article non blocking networking et l'approche de jonke ci-dessus m'a mis sur la bonne voie. Mon serveur bloquait sur la connexion initiale donc j'avais besoin d'être un peu plus bas niveau.
la prise rdoc peut donner plus de détails dans le connect_nonblock
def self.open(host, port, timeout=10)
addr = Socket.getaddrinfo(host, nil)
sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EINPROGRESS
resp = IO.select([sock],nil, nil, timeout.to_i)
if resp.nil?
raise Errno::ECONNREFUSED
end
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EISCONN
end
end
sock
end
pour obtenir un bon test. Démarrez un serveur de socket simple, puis effectuez un ctrl-z pour l'arrière-plan
Le paramètre IO.select attend des données sur le flux d'entrée dans les 10 secondes. cela peut ne pas fonctionner si ce n'est pas le cas.
Il devrait être un bon remplacement de la méthode ouverte de TCPSocket.
Cela fonctionne très bien pour moi. Timeout ne doit en aucun cas être utilisé en raison des threads verts de MRI. – Sardathrion
Une connexion non bloquante est accessible en écriture lorsqu'elle est prête. Utilisez 'IO.select (nil, [sock], nil, timeout.to_i)' – tmm1
Seulement travaillé pour moi après avoir utilisé le commentaire de tmm1. –
- 1. Comment afficher/modifier le délai de connexion socket sur Linux?
- 2. Comment définir le délai d'expiration de la session dans web.config
- 3. Comment définir le délai d'expiration d'un programme?
- 4. Comment définir le délai d'attente pour le pilote ODBC Ruby pour SQL Server?
- 5. Tuning socket connect délai d'appel
- 6. Est-il possible de définir un délai d'attente sur une socket dans Twisted?
- 7. Comment définir le délai de transaction pendant l'application de débogage
- 8. Comment définir le délai d'expiration de smtplib en python 2.4?
- 9. Définir le délai d'attente sur jQuery .load
- 10. java/groovy socket délai d'attente d'écriture
- 11. Définir le délai d'attente pour webClient.DownloadFile()
- 12. définir le délai d'expiration réseau et l'exception dans l'iPhone
- 13. Configuration du délai d'expiration du socket TCP
- 14. Définir le délai de requête OLE à partir de C++
- 15. Délai d'attente Ruby pour Python?
- 16. setSoTimeout sur un socket client n'affecte pas le socket
- 17. Comment définir les constantes de classe-portée dans ruby?
- 18. Récupération d'un socket TCP cassé en Ruby quand dans gets()
- 19. Comment puis-je définir un délai d'attente sur HttpWebRequest.GetRequestStream?
- 20. comment définir le délai d'expiration de la requête à partir de la chaîne de connexion SQL
- 21. Comment définir un délai pendant la recherche d'ejb à distance?
- 22. Comment définir TCP_NODELAY sur un socket BSD sous Solaris?
- 23. Comment contrôler le délai d'attente de session est de 30 secondes dans le BlazeDS?
- 24. Comment définir le délai d'expiration des appels de service Web générés par Java Wireless Toolkit?
- 25. définir long délai d'attente pour la variable de session sélectionnée
- 26. Définir le délai d'attente de l'info-bulle pour un composant particulier dans Java Swing
- 27. Comment définir le délai d'attente lors du remplissage d'une table temporaire basée sur une requête complexe?
- 28. Comment définir le délai d'un script SQL Server à partir du script?
- 29. Comment spécifier le codage du fichier de sortie dans Ruby?
- 30. Comment définir le délai d'expiration de la requête pour une action de contrôleur dans une application mvc asp.net
Trouvé une bien meilleure solution que votre accepté ici: http://stackoverflow.com/a/12111120/216314 –
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/Timeout.html –
[Module de temporisation avec verrous exclusifs] (http://stackoverflow.com/a/15304835/1301972). –