【问题标题】:Ruby on Rails Multiple HTTP request at the same time?Ruby on Rails 同时发出多个 HTTP 请求?
【发布时间】: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 发出请求。我想知道是否有办法做到这一点,以便它可以一次(一起)完成请求,而不是一个完成请求,然后继续下一个请求,依此类推......

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby multithreading httprequest instagram


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多