32
 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

这将作为程序代码工作。我只想打服务器,订单没有问题。我怎么能在红宝石中做到这一点。一种选择是使用线程。

这是一个使用线程的示例。

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调用而不等待响应。

4

3 回答 3

15

轻量级异步处理是 Threads (如您所说)或Fibers的工作。

否则,您应该考虑EventMachine这是一个非常强大的工具。

编辑:上述事件机器的 URL 已失效。这是他们的 GitHub 帐户,https://github.com/eventmachine/eventmachine。它是一个很好的起点。

于 2011-07-10T22:03:19.900 回答
12

这是一篇涵盖该主题的精彩文章。

通常,为此使用线程的可行替代方法是使用Fiber,或者您可以使用em-http-request。在后一个示例中,您可以为您的特定目的省略回调处理。

于 2011-07-10T22:12:32.620 回答
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
}
于 2016-03-01T03:18:36.270 回答