¿Cómo se configura el tiempo de espera para las operaciones de bloqueo en un socket Ruby?¿Cómo configuro el tiempo de espera del socket en Ruby?
Respuesta
La solución que encontré lo que parece funcionar es utilizar Timeout::timeout:
require 'timeout'
...
begin
timeout(5) do
message, client_address = some_socket.recvfrom(1024)
end
rescue Timeout::Error
puts "Timed out!"
end
Usar tiempo de espera es un error. Debido a las barreras verdes, cualquier cosa que bloquee en IO bloqueará el hilo de tiempo de espera y evitará que funcione. – Sardathrion
@Sardathrion, gracias por los comentarios, pero una solución sería mejor que un comentario negativo :) – Mike
Los hilos de rubí están rotos, me temo. Encuentra un mejor idioma, duro pero cierto. – Sardathrion
El objeto de tiempo de espera es una buena solución.
Este es un ejemplo de E/S asíncrona (no bloqueo en la naturaleza y se produce de forma asíncrona a el flujo de la aplicación.)
IO.select(read_array
[, write_array
[, error_array
[, timeout]]]) => array or nil
Puede ser utilizado para obtener el mismo efecto.
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
Creo que el enfoque no bloqueado es el camino a seguir.
Probé el artículo mencionado anteriormente y todavía podría hacer que cuelgue.
este artículo non blocking networking y el enfoque anterior de jonke me puso en el camino correcto. Mi servidor estaba bloqueando en la conexión inicial, así que necesitaba que fuera un nivel un poco más bajo.
la rdoc toma sea capaz de dar más detalles en el 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
para conseguir una buena prueba. inicie un servidor de socket simple y luego haga un ctrl-z al fondo
el IO.select espera que los datos entren en el flujo de entrada en 10 segundos. esto puede no funcionar si ese no es el caso.
Debe ser un buen reemplazo para el método abierto de TCPSocket.
Esto funciona muy bien para mí. Timeout no debe usarse bajo ninguna circunstancia debido a los hilos verdes de MRI. – Sardathrion
Una conexión sin bloqueo aparece como escritura cuando está lista. Use 'IO.select (nil, [sock], nil, timeout.to_i)' – tmm1
Solo funcionó para mí después de usar el comentario de tmm1. –
- 1. Establecer el tiempo de espera del socket en Ruby mediante la opción de socket SO_RCVTIMEO
- 2. ¿Cómo funciona el tiempo de espera de conexión del socket?
- 3. Java, aumente el tiempo de espera del socket
- 4. ¿Cómo manejar el tiempo de espera en Async Socket?
- 5. Tiempo de espera del socket en C++ Linux
- 6. establecer el tiempo de espera para el socket recibir
- 7. ¿Cómo establecer el tiempo de espera en la conexión de socket del cliente?
- 8. Configuración del tiempo de espera del socket en el canal de Netty
- 9. ¿Cómo establecer el tiempo de espera del socket en C al hacer conexiones múltiples?
- 10. ¿Cómo configuro el tiempo de espera de un script de SQL Server dentro del script?
- 11. ¿Cómo desconectar el zócalo ZeroMQ después del tiempo de espera?
- 12. Establecer el tiempo de espera del unicornio
- 13. Configuración del tiempo de espera del zócalo?
- 14. Tiempo de espera de socket de red típico
- 15. ¿Cómo se establece el tiempo de espera en el método recv de socket de python?
- 16. Tiempo de espera de conexión de socket Python
- 17. SSL Tiempo de espera de conexión de socket
- 18. C: tiempo de espera de conexión de socket
- 19. Evitar los tiempos de espera del socket en SQLAlchemy
- 20. Java: tiempo de espera de lectura de socket excepción
- 21. WCF System.TimeoutException: la transferencia del socket agotó el tiempo de espera después de 00:00:00
- 22. ¿Cómo ver/cambiar el tiempo de espera de conexión de socket en Linux?
- 23. Cómo configurar el tiempo de espera de keepalive en Android?
- 24. Cómo rescatar problemas de tiempo de espera (Ruby, Rails)
- 25. ¿Cómo configuro el tiempo de espera de la sesión de más de 30 minutos
- 26. Cómo deshabilitar el tiempo de espera inactivo del grupo de aplicaciones en IIS7?
- 27. Tiempo de espera del subproceso en C#
- 28. ¿Cómo configuro el tiempo de solicitud del cliente jax-ws programáticamente en jboss?
- 29. Cómo reducir el tiempo de espera del servidor?
- 30. ¿Cómo establecer el tiempo de espera en la gema RestClient en Ruby?
Encontré una solución mucho mejor que la aceptada aquí: http://stackoverflow.com/a/12111120/216314 –
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/Timeout.html –
[Módulo de tiempo de espera con bloqueos exclusivos] (http://stackoverflow.com/a/15304835/1301972). –