Ruby on Rails 同时发出多个 HTTP 请求?
Posted
技术标签:
【中文标题】Ruby on Rails 同时发出多个 HTTP 请求?【英文标题】:Ruby on Rails Multiple HTTP request at the same time? 【发布时间】:2013-04-17 03:24:39 【问题描述】:我正在拉多个请求(一次拉一个),我想知道如果我有这样的事情,是否有办法同时拉取所有请求:
client = Instagram.client(:access_token => session[:access_token])
@user = client.user
@recent_media_items = client.user_recent_media
@lv = client.tag_recent_media('lv', options = :count => 60)
@lv1 = client.tag_recent_media('lv1', options = :count => 60)
@lv2 = client.tag_recent_media('lv2', options = :count => 60)
@lv3 = client.tag_recent_media('lv3', options = :count => 60)
每个lv
都向client
发出请求。我想知道是否有办法做到这一点,以便它可以一次(一起)完成请求,而不是一个完成请求,然后继续下一个请求,依此类推......
谢谢!
【问题讨论】:
【参考方案1】:是的!如需概念验证,请尝试
require 'thread'
client = Instagram.client(:access_token => session[:access_token])
@user = client.user
@recent_media_items = client.user_recent_media
threads = []
threads << Thread.new @lv = client.tag_recent_media('lv', options = :count => 60)
threads << Thread.new @lv1 = client.tag_recent_media('lv1', options = :count => 60)
threads << Thread.new @lv2 = client.tag_recent_media('lv2', options = :count => 60)
threads << Thread.new @lv3 = client.tag_recent_media('lv3', options = :count => 60)
threads.each(&:join) # this waits for all the threads to finish before proceeding
puts [@lv, @lv1, @lv2, @lv3]
实际上,您需要在线程中设置一些错误处理和重试设置。此外,您可能会在 Instagram gem 中遇到线程安全问题。如果您正在大规模地使用数百或数千个请求执行此操作,您可能想要尝试像 Typhoeus 这样的并发 HTTP 客户端或像 EM-HTTP-Request 这样的事件 HTTP 客户端。对于这些,您必须手动实现 Instagram gem 中的 tag_recent_media
方法。
【讨论】:
天哪,我认为这个有效!嗯,我想如果我只是在生产中这样做应该没问题吧? 是的,但您可能需要一些错误处理。如果在其中一个线程期间发生异常,threads.each(&:join)
将引发异常。从那里,您可以使用Thread#status 检查哪些线程有异常。您还可以在线程块中使用 retryable 之类的东西来处理网络错误。
你的例子不是在每个Thread.new ...
前面都少了一个threads <<
吗?【参考方案2】:
像 spawn 这样的 gem 可以在分叉进程中或作为进程中的新线程执行此操作。这是另一个讨论它的 SO 帖子的链接
What is the difference between forking and threading in a background process?
这是有问题的宝石:https://github.com/tra/spawnling
【讨论】:
以上是关于Ruby on Rails 同时发出多个 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ruby on Rails 发出 HTTP 请求?
ruby 确定是否由机器人发出请求。来自http://stackoverflow.com/questions/5882264/ruby-on-rails-how-to-determine-if-a-r
如何在 ruby on rails 中集成多个支付网关(多个商家)?
如何在 ruby on rails 中结合救援多个异常?