2015-12-19 2 views
4

Я читал, что пассажир является многопроцессорным сервером, что означает, что он может обрабатывать сразу несколько запросов.Rails: Пассажир, не обслуживающий несколько запросов одновременно

Я запускаю пассажира в автономном режиме на своей локальной машине и написали код, чтобы проверить, может ли пассажир одновременно запускать несколько запросов. Мой код:

class Test < ApplicationController 

def index 
    sleep 10 
end 
end 

Я ударяя два запроса HTTP одновременно и ожидаю два запроса, чтобы вернуть выход через 10 секунд, но один запрос возвращает выход через 10 секунд и еще один выход возвращается через 20 секунд. Таким образом, он доказывает, что он обрабатывает один запрос одновременно, а не одновременно.

Означает ли это, что пассажир - это единственный сервер процессов, а не многопроцессорный сервер? или я что-то упускаю.

+0

вы можете изучить [Nginx + пассажир] (https://www.phusionpassenger.com/library/config/nginx/optimization/) .. Я думаю, что он принимает 1 процесс по умолчанию, вам нужно настроить его для многопроцессорной обработки – Minato

ответ

1

Пассажир (как и большинство других серверов приложений) выполняет не более одного запроса на поток. Как правило, для каждого процесса существует только один поток. Из пассажирских Документов Phusion:

Phusion Пассажир поддерживает две модели параллелизма:

процесса: однопоточная, мульти-обработанные/вывода параллелизма я. Каждый процесс приложения имеет только один поток и может обрабатывать только один запрос за раз. Это модель параллелизма, традиционно используемая приложениями Ruby. Он обладает превосходной совместимостью (может работать с приложениями, которые не предназначены для потоковой защиты), но это неподходящие рабочие нагрузки, в которых приложение должно ждать большого количества внешних операций ввода-вывода (например, HTTP API-вызовы) и использует больше памяти, поскольку каждый процесс имеет большие накладные расходы памяти.

thread: многопоточный, многопроцессорный параллельный параллельный ввод-вывод. Каждый процесс приложения имеет несколько потоков (настраивается через PassengerThreadCount). Эта модель обеспечивает гораздо лучший параллелизм ввода-вывода и использует меньше памяти, поскольку потоки совместно используют память друг с другом в рамках одного и того же процесса. Однако использование этой модели может привести к проблемам с совместимостью, если приложение не предназначено для потоковой защиты.

(Выделено мой собственный)

1

попробовать как

def index 
    n = params[:n].to_i 
    sleep n 
    render :text => "I should have taken #{n} seconds!" 
    end 
Смежные вопросы