【问题标题】:Rails: Passenger not serving multiple requests at a timeRails:乘客一次不服务多个请求
【发布时间】:2015-12-19 18:26:01
【问题描述】:

我读到乘客是一个多进程服务器,这意味着它可以一次处理多个请求。

我在本地机器上以独立模式运行乘客,并编写了代码来检查乘客是否能够同时运行多个请求。我的代码是:

class Test < ApplicationController

 def index
   sleep 10
 end 
end

我同时访问了两个 http 请求,并期望两个请求在 10 秒后返回输出,但一个请求在 10 秒后返回输出,另一个请求在 20 秒后返回输出。所以它证明它一次处理一个请求而不是同时处理一个请求。

这是否意味着乘客是单进程服务器而不是多进程服务器?或者我错过了什么。

【问题讨论】:

  • 你可以学习nginx + passenger..我认为它默认假设1个进程你需要配置它以进行多处理

标签: ruby-on-rails passenger


【解决方案1】:

Passenger(以及大多数其他应用程序服务器)每个线程运行的请求不超过一个。通常每个进程也只有一个线程。来自 Phusion 乘客文档:

Phusion Passenger 支持两种并发模型:

process:单线程、多处理的 I/O 并发。每个应用程序进程只有一个线程,一次只能处理 1 个请求。这是 Ruby 应用程序传统上使用的并发模型。它具有出色的兼容性(可以与并非设计为线程安全的应用程序一起使用),但不适合应用程序必须等待大量外部 I/O(例如 HTTP API 调用)的工作负载,并且使用更多内存,因为每个进程都有很大的内存开销。

thread:多线程、多处理的 I/O 并发。每个应用程序进程都有多个线程(可通过PassengerThreadCount 自定义)。该模型提供了更好的 I/O 并发性并使用更少的内存,因为线程在同一进程中彼此共享内存。但是,如果应用程序并非设计为线程安全的,则使用此模型可能会导致兼容性问题。

(强调我自己的)

【讨论】:

  • 那么这里的集群呢?乘客可以通过集群处理多个请求。
【解决方案2】:

试试看

 def index
    n = params[:n].to_i
    sleep n
    render :text => "I should have taken #{n} seconds!"
  end

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多