ruby中的异步http请求

Moh*_*ain 31 ruby ruby-on-rails http ruby-on-rails-3 mixpanel

 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
Run Code Online (Sandbox Code Playgroud)

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

这是使用线程的示例.

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
Run Code Online (Sandbox Code Playgroud)

更好的解决方案.. ??

PS: - 我想点击mixpanel,这就是为什么我只想进行http调用而不等待响应.

apn*_*ing 14

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

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

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


emb*_*oss 12

这是一篇很棒的文章,涵盖了这个主题.

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

  • @pguardiario - Fibers绝对会在任何IO绑定任务上为您提供并发性.你是正确的,对于CPU绑定的任务,你需要多个线程,但是当大多数人关心"并发"时,它通常用于并行网络请求,中间只有很少的处理. (2认同)