Ruby on Rails同时有多个HTTP请求?

hel*_*llo 8 ruby multithreading ruby-on-rails httprequest instagram

我正在提出多个请求(它一次拉出一个请求),我想知道如果我有这样的事情,是否有同时拉请求全部的方式:

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

每个人都lv提出要求client.我想知道是否有办法这样做,所以它可以一次性(一起)完成请求,而不是一个完成请求,然后继续下一个请求,依此类推......

谢谢!

Ben*_*nns 12

是! 对于概念验证,请尝试

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

实际上,您需要在线程中设置一些错误处理和重试设置.此外,您可能会在Instagram gem中遇到线程安全问题.如果您大规模地执行此操作有数百或数千个请求,您可能需要尝试像Typhoeus这样的并发HTTP客户端或像EM-HTTP-Request这样的公平HTTP客户端.对于这些,您必须手动实现tag_recent_mediaInstagram gem中的方法.

  • 是的,但你可能想要一些错误处理.如果在其中一个线程中发生异常,`threads.each(&:join)`将引发异常.从那里,您可以使用[Thread#status](http://ruby-doc.org/core-2.0/Thread.html#method-i-status)来检查哪些线程有异常.您还可以在线程块中使用[retryable](https://github.com/nfedyashev/retryable)之类的东西来处理网络错误. (3认同)

小智 5

有像 spawn 这样的 gem 在分叉进程中执行此操作,或者作为进程中的新线程执行此操作。这是另一个讨论它的 SO 帖子的链接

后台进程中的分叉和线程有什么区别?

这是有问题的宝石:https : //github.com/tra/spawnling