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(&amp;:join) 将引发异常。从那里,您可以使用Thread#status 检查哪些线程有异常。您还可以在线程块中使用 retryable 之类的东西来处理网络错误。 你的例子不是在每个Thread.new ...前面都少了一个threads &lt;&lt;吗?【参考方案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 中结合救援多个异常?

Ruby-on-Rails:多个 has_many :通过可能吗?

Ruby on Rails:删除多个哈希键