2013-05-25 2 views
0

나는 웹 서버로 thin을 사용하는 sinatra 앱을 가지고 있습니다. ActiveRecord을 통해 데이터베이스와 상호 작용합니다.이 이벤트 루프를 차단합니까?

엔드 포인트에,이 할 경우

get '/test' do 
    Model.create(.....) 
end 

Model.create(.....) 이벤트 루프를 차단 하는가 (얇은 사용 eventmachine 내부를)? 그렇다면이 점과 대안은 무엇입니까?

감사

+0

모든 작업이 완료 될 때까지 스레드를 "차단"합니다. 이벤트 머신 스레드 (하나만 사용)는 요청 메소드를 호출하면 메소드가 완료 될 때까지 차단됩니다. – user2246674

답변

0

나의 이해는 당신이 그것을 사용하지 않는 thin가 기본적으로 스레드되어 있다는 점이다. 따라서 요청 처리기는 Eventmachine::Defer을 사용하여 비동기 적으로 실행될 수 있습니다.

예, @ user2246674의 의견에 따르면, 처리기가 원자로 스레드에서 실행되면 모든 것을 차단합니다.

대안으로 나는 방금 ActiveRecord and Eventmachine을 검색했으며 첫 번째 히트는이 코드가있는 코드 인 http://www.mikeperham.com/2010/03/30/using-activerecord-with-eventmachine/입니다. 을 지원하는 https://github.com/igrigorik/em-synchrony의 "em-synchrony"를 살펴 보는 것이 유용 할 수 있습니다.

또한 관련 주제에 대한 내 자신의 질문입니다 : async requests using sinatra streaming API 비동기 요청 처리를 구현하기 위해 Sinatra의 스트리밍 API를 사용합니다.

저는 개인적으로 Sinatra 앱에서 직접 DB 액세스를 사용합니다. 그것이 내가 항상하는 일입니다. ActiveRecord은 너무 무겁습니다.

+0

자세한 답변을 보내 주셔서 감사합니다. DB에 직접 액세스한다는 것은 무엇을 의미합니까? mysql2 gem을 사용하고 원시 쿼리를 전달하는 것을 의미합니까? – 0xSina

+0

예 ............ – akonsu

+0

여기에'EM.Defer'에 관한 글이 있습니다 : http://stackoverflow.com/questions/10881594/why-sinatra-request-takes-em-thread? rq = 1 – akonsu

관련 문제