10

我正在拉多个请求(一次拉一个),我想知道如果我有这样的东西,是否有办法同时拉取请求:

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. 我想知道是否有办法做到这一点,以便它可以一次(一起)完成请求,而不是一个完成请求,然后继续下一个请求,依此类推......

谢谢!

4

2 回答 2

14

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

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 客户端。对于这些,您必须手动实现tag_recent_mediaInstagram gem 中的方法。

于 2013-04-17T03:53:12.643 回答
5

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

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

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

于 2013-04-17T03:32:50.820 回答