2014-11-09 1 views
1

Я пытаюсь понять параллелизм Ruby с приложением Sinatra.
Вот оно:Как выполнять две функции одновременно от одного маршрута в Синатре?

require 'sinatra' 

get '/a' do 
    sleep 10 
    "result_a" 
end 

get '/b' do 
    "result_b" 
end 

Если я запускаю его как ruby app.rb или shotgun app.rb, а затем перейти и к , а затем - не будет загружен до выполняет и загружает себя.
Когда я раскрываю это приложение для Heroku, хотя, и перейти к затем , загружается сразу.
Как я понимаю, процесс Heroku равен . Параллельно (или многопоточно?) В отличие от моих локальных процессов.

Мои вопросы: как запускать мое приложение одновременно на локальном сервере? Можно ли запускать, например, две функции одновременно с одного маршрута?

ответ

1

Установить Единорог.

gem install unicorn 

The official docs не велики, но вы можете найти множество учебников показывая вам, как настроить и запустить параллельные процессы сервера, которые позволяют одновременно обслуживать несколько запросов.

Он работает путем форматирования вашего процесса, что означает, что он полностью потокобезопасен, но также означает, что одновременные запросы не будут разделять состояние памяти друг с другом. На самом деле, они не будут обмениваться памятью, поэтому, если ваше приложение имеет поистине огромный объем памяти (например, какая-то база данных в памяти), вам понадобится другое решение. В противном случае Unicorn - очень популярный и надежный инструмент параллелизма для веб-приложений Ruby; на самом деле это то, что позволяет Heroku демонстрировать параллелизм, который вы видите.

+0

Ах. Нет. Похоже, вам, возможно, понадобится использовать «Thread» Ruby. То, над чем вы работаете, - довольно сложная проблема, но не невозможная. –

+0

И Единорог позволит мне запускать несколько функций одновременно с одного маршрута? [получил это, Ruby's 'Thread', спасибо] – lakesare

+0

Единорог позволит вам одновременно запускать два отдельных фрагмента кода с одного и того же маршрута или один и тот же фрагмент кода одновременно. Это зависит от того, что вы настроили для своего маршрута. Однако Единорог не позволит вам действовать на одном и том же объекте в памяти из контекста двух отдельных запросов. –

Смежные вопросы