2011-07-10 11 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 

To będzie działać jako kod proceduralny. Po prostu chcę trafić serwer, bez problemów z zamówieniem. Jak mogę to zrobić w ruby? Jedną z opcji jest używanie wątków.asynchroniczne żądanie http w ruby ​​

Oto przykład użycia wątków.

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 

Jakieś lepsze rozwiązanie .. ??

PS: - chcę uderzyć w mixpanel, dlatego właśnie chcę wykonać połączenie http i nie czekać na odpowiedź.

Odpowiedz

12

Lekka obsługa asynchroniczna to zadanie wątków (jak wspomniałeś) lub Fibers.

W przeciwnym razie należy wziąć pod uwagę EventMachine, które jest bardzo potężnym narzędziem.

+0

prostu zastanawiasz się: jesteś kodowania w Ruby lub Rails? – apneadiving

+0

szyny, pytanie jest oznaczone szynami 3 :) –

+0

ok, nie byłem pewien. Cokolwiek, to nie zmienia mojej odpowiedzi :) – apneadiving

11

Oto great article obejmujący temat.

Ogólnie rzecz biorąc, realną alternatywą dla używania wątków w tym przypadku byłoby użycie Fiber lub można użyć em-http-request. W tym ostatnim przykładzie można pominąć obsługę wywołań zwrotnych dla określonego celu.

+0

To mylące powiedzieć, że włókna są alternatywą dla nici. Włókna nie dadzą ci współbieżności. – pguardiario

+2

@pguardiario - Fibers absolutnie da ci współbieżność ... w każdym zadaniu związanym z IO. Masz rację, że dla zadań związanych z procesorem potrzebujesz wielu wątków, ale gdy większość ludzi obawia się "współbieżności", zwykle jest to równoległe żądanie sieciowe z minimalnym przetwarzaniem. –

2

Jeśli chodzi tylko o zwykłe żądania http w stylu asynchronicznym, prawdopodobnie najlepiej jest uzyskać Unirest.

prośba

ASNC jest tak proste, jak:

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 
} 
Powiązane problemy