2010-12-17 18 views

Respuesta

17

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

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

+1

Así es como funciona, no hay ocupado esperando que suceda. – Theo

+0

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

Cuestiones relacionadas