【问题标题】:How Rails serves concurrent requestsRails 如何处理并发请求
【发布时间】:2015-07-09 12:37:33
【问题描述】:

我会将这个问题分为两部分
第 1 部分:
Rails 如何为同一操作提供并发请求?
Rails 是在不同的线程中处理并发请求还是在队列中服务?

第 2 部分:
为什么要问?
我做了一个非常具体的项目。现在我考虑在必要时更改应用程序架构。

问题

前言
我有带有动作计算的控制器。 好像是这样的:

 def calculate
      first_player_code  = Code.find(params[:first_player_id])
      second_player_code = Code.find(params[:second_player_id])
      File.open("first_player_code.rb", "w"){|file| file << first_player_code}
      File.open("second_player_code.rb", "w"){|file| file << second_player_code}
      system("ruby calculate.rb")
 end

calculate.rb 是包含脚本,它使用文件“first_player_code.rb”和“second_player_code.rb”。
此脚本生成 JSON 文件作为结果并将其发送到浏览器。

更多信息
first_player_code.rb”和“second_player_code.rb”包含 Ruby 类。
“calculate.rb”中,我需要这些文件并从这些文件中的类制作对象
我只是没有找到另一种方法(不使用文件)。

问题本身
是否存在同步问题?

【问题讨论】:

  • Rails 不处理并发请求。一次只有一个。这是 Web 服务器启动更多线程或工作线程(或使用事件 I/O)以实现某些并发性的工作
  • 问题是:什么运行你的 Rails 应用程序?
  • 如果我理解正确,我不能依赖 Rails(standart) 并行性(如果我自己没有意识到)。我将在主帖中添加有关脚本的更多信息。
  • 你在说什么“标准并行”?没有。 Rails 作为一个框架,按顺序处理请求,一个接一个。当然,可能会有多个 Rails 实例同时运行,但这不属于 Rails 本身的业务范围。
  • 看来我对 Rails 的理解有误。您能否推荐一些资源,让我了解 Rails 的工作原理?

标签: ruby-on-rails ruby multithreading


【解决方案1】:

您通常会配置像Puma 这样的Web 服务器,它使用线程来同时处理请求并将它们传递给Rails 应用程序。常规 MRI ruby​​ 无法实现真正​​的线程化,因为全局解释器锁可防止一次运行多个线程。

对于长时间运行的进程,您应该尝试通过将它们传递给后台作业来防止阻塞。 Sidekiq 是个不错的选择。

另见https://github.com/ruby-concurrency/concurrent-ruby

【讨论】:

  • 谢谢,但我认为,这里最好的方法是重新组织我的应用程序的架构。并尽量不要使用文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2018-12-31
  • 2012-05-09
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多