Rails如何服务并发请求

时间:2015-07-09 12:37:33

标签: ruby-on-rails ruby multithreading

我将把这个问题分成两部分 第1部分:
Rails如何为同一个动作提供并发请求? Rails是否在不同的主题中提供并发请求,或者在队列中提供Rails?

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

问题

前言
我有控制器与动作计算。 看起来像是这样:

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
    <div class="row">
        <div class="col-md-2">
            <fieldset>
                <legend>
                     <h6>RB:</h6>

                </legend>
                <div class="row">
                    <div class="radio">
                        <label>
                            <input type="radio" name="optradio">Option 1</label>
                    </div>
                </div>
                <div class="row">
                    <div class="radio">
                        <label>
                            <input type="radio" name="optradio">Option 1</label>
                    </div>
                </div>
            </fieldset>
        </div>
        <div class="col-md-1">
            <fieldset>
                <legend>
                     <h6>CB:</h6>

                </legend>
                <div class="row">
                    <input type="checkbox" value="">
                </div>
                <div class="row">
                    <input type="checkbox" value="">
                </div>
            </fieldset>
        </div>
    </div>
</div>

calculate.rb 包含脚本,该脚本使用“ first_player_code.rb ”和“ second_player_code.rb ”文件。
该脚本将 JSON 文件作为结果发送给浏览器。

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

问题本身
是否有同步问题?

1 个答案:

答案 0 :(得分:0)

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

对于长时间运行的进程,您应该尝试通过将这些进程传递给后台作业来阻止阻塞。 Sidekiq是一个很好的选择。

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