RoR:连续多次调用同一个长时间响应控制器

sko*_*ozz 5 concurrency ruby-on-rails heroku engineyard

更新:

如果您遇到同样的问题,请先阅读" 指示延迟作业已完成的ajax进程 ".谢谢基因.


我有并发问题.我有一个控制器刮几个网站,但每次调用我的控制器需要大约4-5秒来响应.

因此,如果我连续调用2次(或更多次),则第二次调用需要等待第一次调用才能启动.

那我怎么能在我的控制器中解决这个问题呢?也许像EventMachine这样的东西?

更新和示例:

application_controller.rb

def func1
    i=0
    while i<=2
        puts "func1 at: #{Time.now}"
        sleep(2)
        i=i+1
    end
end

def func2
    j=0
    while j<=2
        puts "func2 at: #{Time.now}"
        sleep(1)
        j=j+1
    end
end
Run Code Online (Sandbox Code Playgroud)

whatever_controller.rb

puts ">>>>>>>> Started At #{Time.now}"
  func1()
  func2()
puts "End at #{Time.now}"
Run Code Online (Sandbox Code Playgroud)

所以现在我需要从同一个用户/浏览器/等同时多次请求http://myawesome.app/whatever.

我用Unicorn尝试过Heroku(和本地),但没有成功,这是我的设置:

要求:

  • 我需要一个RESTful解决方案.这是API所以我需要响应JSON

更多信息: 我现在正在运行2台云服务器.

  • Heroku与独角兽
  • 与Nginx + Panssenger的工程师云

小智 2

对于任何长响应时间控制器功能,gem是delayed job一个 很好的选择。虽然它经常用于批量邮件发送,但它也适用于任何长时间运行的任务。

您的控制器启动延迟作业并立即响应一个包含占位符(通常是带有进度指示器的图形)的页面,以及 Ajax 或定时重新加载,以在可用时使用完整信息更新页面。关于如何解决这个问题的一些信息可以在这篇 SO 文章中找到

文章中没有提到的是,您可以使用 redis 或其他一些内存缓存来存储结果,而不是使用主数据库。