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

這將作爲程序代碼工作..我只想打一臺服務器,沒有關於訂單的問題。我怎麼能做到這一點在紅寶石。一種選擇是使用線程。ruby​​中的異步http請求

下面是一個使用線程的例子。

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 

任何更好的解決方案.. ??

PS: - 我想打mixpanel,所以這就是爲什麼我只想做一個http調用,不要等待響應。

回答

12

輕量級異步處理是線程的工作(如您所說)或Fibers

否則,你應該考慮EventMachine這是一個非常強大的工具。

+0

只是想知道:你在Ruby或Rails的編碼? – apneadiving

+0

鐵軌,問題標記爲鐵軌3 :) –

+0

好的,不確定。無論如何,它不會改變我的答案:) – apneadiving

11

以下是涵蓋該主題的great article

通常,使用線程的可行替代方法是使用Fiber或者您可以使用em-http-request。在後面的例子中,您可以忽略回調處理以滿足您的特定目的。

+0

這是誤導的說纖維是線程的替代品。纖維不會給你併發。 – pguardiario

+2

@pguardiario - 纖維絕對會給你併發......在任何IO綁定任務上。對於CPU綁定任務而言,你是正確的,你需要多個線程,但是當大多數人關心「併發」時,它通常是並行的網絡請求,只需要最少的處理。 –

2

如果它只是簡單的http請求異步風格,可能Unirest是最好的實現它。

ASNC的要求是簡單的:

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 
}