2014-11-09 3 views
1

나는 Sinatra 앱으로 Ruby 동시성을 이해하려고한다. 여기
그것입니다Sinatra의 한 경로에서 두 기능을 동시에 실행하는 방법은 무엇입니까?

require 'sinatra' 

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

get '/b' do 
    "result_b" 
end 

내가 ruby app.rb 또는 shotgun app.rb로 실행 한 다음/모두 로 이동하면 다음 /B - /B로드되지 않습니다까지 /A 실행되고로드됩니다. 그래도 난 Heroku가이 응용 프로그램을 배포하고/로 이동
다음/B/B 즉시로드됩니다.
내가 이해하는 것처럼 Heroku 프로세스는 로컬 프로세스가 아닌 동시 (또는 다중 스레드?)입니다.

내 질문은 : 로컬 응용 프로그램을 동시에 로컬 서버에서 실행하는 방법입니까? 한 경로에서 예를 들어 두 가지 기능을 동시에 실행할 수 있습니까?

답변

1

유니콘을 설치하십시오.

gem install unicorn 

official docs

큰되지 않습니다하지만 당신은 어떻게 구성하고 동시에 여러 개의 요청을 처리 할 수 ​​있도록 병렬 서버 프로세스를 시작하는 방법을 보여주는 튜토리얼을 많이 찾을 수 있습니다.

이것은 프로세스를 포킹하여 작동합니다. 즉, 스레드로부터 완전히 안전함을 의미하지만 동시에 동시 요청이 서로 메모리 상태를 공유하지 않음을 의미합니다. 실제로 메모리를 공유하지 않기 때문에 앱에 엄청난 메모리 공간 (예 : 일종의 메모리 내장형 데이터베이스)이 있으면 다른 솔루션이 필요합니다. 그렇지 않으면 Unicorn은 Ruby 웹 앱을위한 매우 인기 있고 신뢰할 수있는 동시성 도구입니다. 그것은 실제로 당신이보고있는 동시성을 Heroku에 보여줄 수 있습니다.

+0

아. 루비의 '스레드'기능을 사용해야 할 수도 있습니다. 지금하고있는 일은 상당히 까다로운 문제이지만 불가능한 것은 아닙니다. –

+0

유니콘은 한 경로에서 여러 기능을 동시에 실행할 수 있습니까? [알았어, Ruby의'Thread', 고마워] – lakesare

+0

유니콘은 동일한 경로에서 두 개의 코드를 동시에 실행하거나 동일한 코드를 두 번 동시에 실행할 수있게합니다. 그것은 당신이해야 할 당신의 노선을 가지고있는 것에 달려 있습니다. 그러나 Unicorn은 두 개의 개별 요청의 컨텍스트에서 메모리의 동일한 객체에 대해 작업하도록 허용하지 않습니다. –

관련 문제