2011-07-10 15 views
26
require 'net/http' 

urls = [ 
    {'link' => 'http://www.google.com/'}, 
    {'link' => 'http://www.facebook.com/'}, 
{'link' => 'http://www.yahoo.com/'} 
] 

urls.each do |u| 
    u['content'] = Net::HTTP.get(URI.parse(u['link'])) 
end 

print urls 

Esto funcionará como código de procedimiento. Solo quiero conectarme a un servidor, no hay problemas con el pedido. ¿Cómo puedo hacer eso en ruby? Una opción es usar hilos.solicitud HTTP asíncrona en ruby ​​

Aquí hay un ejemplo con hilos.

require 'net/http' 

urls = [ 
    {'link' => 'http://www.google.com/'}, 
    {'link' => 'http://www.facebook.com/'}, 
    {'link' => 'http://www.yahoo.com/'} 
] 

urls.each do |u| 
    Thread.new do 
    u['content'] = Net::HTTP.get(URI.parse(u['link'])) 
    puts "Successfully requested #{u['link']}" 

    if urls.all? {|u| u.has_key?("content") } 
     puts "Fetched all urls!" 
     exit 
    end 
    end 
end 

Cualquier solución mejor .. ??

PD: - Quiero presionar Mixpanel, así que es por eso que solo quiero hacer una llamada http y no esperar la respuesta.

Respuesta

12

El manejo liviano de Async es el trabajo de los hilos (como dijiste) o Fibers.

De lo contrario, debe considerar EventMachine que es una herramienta muy poderosa.

+0

Sólo me preguntaba: ¿estás codificando en Ruby o Rails? – apneadiving

+0

rieles, la pregunta está etiquetada con rieles 3 :) –

+0

bien, no estaba seguro. Lo que sea, no cambia mi respuesta :) – apneadiving

11

Aquí hay un great article que cubre el tema.

En general, las alternativas viables para usar hilos para esto serían el uso de un Fiber o podría usar em-http-request. En el último ejemplo, podría dejar de lado el manejo de devolución de llamada para su propósito particular.

+0

Es engañoso decir que las fibras son una alternativa a los hilos. Las fibras no te darán concurrencia. – pguardiario

+2

@pguardiario - Fibras absolutamente le dará concurrencia ... en cualquier tarea vinculada a IO. Tiene razón en que para las tareas vinculadas a la CPU, quiere múltiples subprocesos, pero cuando a la mayoría de la gente le preocupa la "concurrencia", generalmente es para solicitudes de red paralelas con solo un procesamiento mínimo entre ellas. –

2

Si solo se trata de solicitudes HTTP simples en estilo asíncrono, probablemente Unirest es la mejor opción para lograrlo.

solicitud

ASNC es tan simple como:

response = Unirest.post "http://httpbin.org/post", 
        headers:{ "Accept" => "application/json" }, 
        parameters:{ :age => 23, :foo => "bar" } {|response| 
response.code # Status code 
response.headers # Response headers 
response.body # Parsed body 
response.raw_body # Unparsed body 
}