Я собрал простой пример, пытающийся доказать параллельные запросы в Rails, используя базовый пример. Обратите внимание, что я использую MRI Ruby2 и Rails 4.2.
def api_call
sleep(10)
render :json => "done"
end
Затем я перехожу к 4 различным вкладкам в Chrome на моем Mac (ядро I7/4) и вижу, запускаются ли они последовательно или параллельно (действительно параллельное, но близкое, но не одно и то же). то есть http://localhost:3000/api_call
Я не могу заставить это работать с помощью Puma, Thin или Unicorn. Запросы каждый поступают последовательно. Первая вкладка через 10 секунд, вторая после 20 (поскольку она должна была дождаться завершения первой), третий после этого....
Из того, что я прочитал, я считаю, что справедливо следующее (пожалуйста, поправьте меня) и мои результаты:
- Unicorn - многопроцессор, и мой пример должен был работать (после определения числа рабочих в файле конфигурации unicorn.rb), но это не так. Я могу видеть 4 рабочих, но все работает последовательно. Я использую драгоценный камень unicorn-rails, начиная рельсы с unicorn -c config/unicorn.rb, а в моем unicorn.rb у меня есть:
- unicorn.rb
worker_processes 4
preload_app true
timeout 30
listen 3000
after_fork do |server, worker|
ActiveRecord::Base.establish_connection
end
- Thin и Puma многопоточные (хотя Puma по крайней мере имеет режим clustered ', где вы можете начинать работу с -w параметр) и не должен работать в любом режиме (в многопоточном режиме) с помощью MRI Ruby2.0, потому что "существует глобальная блокировка перехватчика (GIL), которая обеспечивает одновременный запуск только одного потока".
Итак,
- Есть ли у меня допустимый пример (или используется сбой просто неправильно)?
- Правильны ли мои утверждения выше о многопроцессорности и многопоточности (по отношению к MRI Rails 2)?
- Любые идеи о том, почему я не могу заставить его работать с Unicorn (или любым сервером в этом отношении)?
Есть очень похожий вопрос для моего, но я не могу заставить его работать как ответ, и он не отвечает на все мои вопросы о параллельных запросах с использованием МРТ Рубин.
Проект Github: https://github.com/afrankel/limitedBandwidth (примечание: проект рассматривает больше, чем этот вопрос о многопроцессорной/потоковой передаче на сервере)