2011-07-10 175 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 
}