Si digo que quiero recuperar una página web para analizar, pero no bloquear la CPU mientras se está realizando la E/S. ¿Hay algo equivalente a la biblioteca de Eventlet de Python?¿Cuál es la forma preferida de realizar E/S sin bloqueo en Ruby?
Respuesta
No estoy seguro de qué es lo que hace Eventlet, pero Ruby tiene EventMachine, una biblioteca para IO no bloqueante (amongst other things).
La mejor biblioteca de cliente HTTP para Ruby es Typhoeus, se puede usar para realizar múltiples solicitudes HTTP en paralelo sin bloqueos. Hay un bloqueo y sin bloqueo de interfaz:
# blocking
response = Typhoeus::Request.get("http://stackoverflow.com/")
puts response.body
# non-blocking
request1 = Typhoeus::Request.new("http://stackoverflow.com/")
request1.on_complete do |response|
puts response.body
end
request2 = Typhoeus::Request.new("http://stackoverflow.com/questions")
request2.on_complete do |response|
puts response.body
end
hydra = Typhoeus::Hydra.new
hydra.queue(request1)
hydra.queue(request2)
hydra.run # this call is blocking, though
Otra opción es em-http-request, que se ejecuta en la parte superior de EventMachine. Cuenta con una interfaz completamente sin bloqueo:
EventMachine.run do
request = EventMachine::HttpRequest.new('http://stackoverflow.com/').get
request.callback do
puts request.response
EventMachine.stop
end
end
Hay también una interfaz para hacer muchas solicitudes en paralelo, de manera similar a Typhoeus Hydra.
La desventaja de em-http-request es que está vinculada a EventMachine. EventMachine es un marco impresionante en sí mismo, pero es un acuerdo de todo o nada. Debes escribir toda tu aplicación en un estilo que sea evented/continuation-passing-style, y que se sabe que causa daño cerebral. Typhoeus se adapta mucho mejor a las aplicaciones que aún no están cubiertas.
- 1. ¿Cuál es la forma preferida de realizar autenticación y autorización de usuario en Clojure?
- 2. ¿Cuál es la forma preferida de implementar una aplicación Symfony2?
- 3. Programación de DirectX en Windows, ¿cuál es la forma preferida?
- 4. ¿Cuál es la forma preferida de eventos de burbujas?
- 5. ¿Cuál es la forma preferida de preasignar matrices NumPy?
- 6. ¿Cuál es la forma preferida de usar métodos de ayuda en Ruby?
- 7. ¿Cuál es la forma preferida de configurar una aplicación mono?
- 8. ¿Cuál es la forma preferida de implementar hashCode()?
- 9. ¿Cuál es la forma preferida de combinar dos sumideros?
- 10. ¿Cuál es la forma preferida de implementar configuraciones en una aplicación Ruby on Rails 3?
- 11. ¿Cuál es su forma preferida de producir gráficos en una aplicación web de Ruby on Rails?
- 12. Rieles: ¿Cuál es la gema preferida de Mailchimp?
- 13. ¿Cuál es la forma más limpia de escribir un ciclo sin bloqueo en javascript?
- 14. ¿Cuál es la forma preferida de incluir fuentes QML en la creación de tu aplicación?
- 15. ¿Cuál es la forma preferida de implementar un método de fábrica en C++?
- 16. ¿Cuál es la forma preferida de pasar el puntero/referencia al objeto existente en un constructor?
- 17. ¿Cuál es la forma preferida de salir de un programa de línea de comando?
- 18. ¿Cuál es la forma preferida (mejor estilo) para nombrar un espacio de nombres en Ruby? ¿Singular o plural?
- 19. ¿Cuál es la forma preferida de implementar un enlace o devolución de llamada en Python?
- 20. ¿Cuál es la JVM en tiempo real (RTSJ) más preferida?
- 21. ¿Cuál es la condición preferida en el ciclo?
- 22. ¿Cuál es la forma preferida de construir objetos en C#? ¿Parámetros o propiedades del constructor?
- 23. ¿Cuál es la forma preferida de pasar datos entre dos aplicaciones en el mismo sistema?
- 24. ¿Cuál es la forma preferida de administrar el pedido en el patrón del generador?
- 25. ¿Cuál es la forma preferida de sangrar casos en un interruptor?
- 26. ¿Cuál es la forma preferida de mostrar imágenes grandes en OpenGL
- 27. ¿Cuál es la forma preferida de usar las colecciones paralelas en Scala?
- 28. ¿Cuál es la forma preferida de devolver una tabla vacía en SQL?
- 29. ¿Cuál es la forma canónica de recortar una cadena en Ruby sin crear una nueva cadena?
- 30. ¿Cuál es la forma preferida de encadenar las funciones de Underscore.js?
Cuando diga que la llamada a hydra.run se está bloqueando, está bien, siempre que permanezca en estado de suspensión y se active cuando se complete la E/S. Esto es lo que busco lograr, al igual que con la E/S impulsada por eventos en Windows. Cualquiera que sea el hilo sobre el que se realiza la llamada hydra.run, no debe tomar CPU mientras bloquea, porque esencialmente está esperando un evento. ¿Así es como funciona Hydra? Si no, creo que es una especie de derrota para el propósito. Si puede confirmar, marcaré esto como aceptado. Gracias. –
Así es como funciona, no hay ocupado esperando que suceda. – Theo
En mi caso, necesito liberar el hilo actual y no bloquearlo en absoluto. ¿Hay alguna forma de evitar la llamada de bloqueo 'hydra.run'? ¿Hay otras gemas ruby HTTP que admitan un enfoque completamente no bloqueante? –