Блокирует ли это цикл событий?

У меня есть приложение sinatra, которое использует thin в качестве веб-сервера. Я взаимодействую со своей базой данных через ActiveRecord.

Если в конечной точке, я делаю это:

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

Блокирует ли Model.create(.....) цикл событий (тонкий использует eventmachine внутри)? Если да, то насколько это плохо и какие есть альтернативы?

Спасибо


person 0xSina    schedule 25.05.2013    source источник
comment
Все действия блокируют поток до завершения. Если поток обработки событий (он использует только один) вызывает метод запроса, он будет заблокирован до тех пор, пока метод не завершится.   -  person user2246674    schedule 25.05.2013


Ответы (2)


Насколько я понимаю, thin по умолчанию имеет многопоточность, если вы не отключите это. Таким образом, ваш обработчик запросов может выполняться асинхронно с использованием Eventmachine::Defer.

Да, как говорится в комментарии @user2246674, если ваш обработчик выполняется в потоке реактора, он все заблокирует.

Что касается альтернатив, я только что поискал в Google ActiveRecord and Eventmachine, и первым попался этот пост с некоторым кодом: http://www.mikeperham.com/2010/03/30/using-activerecord-with-eventmachine./. Возможно, вам будет полезно взглянуть на «em-synchrony»: https://github.com/igrigorik/em-synchrony с поддержкой ActiveRecord.

Вот также мой собственный вопрос по связанной теме: асинхронные запросы с использованием потокового API Sinatra Там я использую потоковый API Sinatra для реализации асинхронной обработки запросов.

Лично я бы использовал прямой доступ к БД из моего приложения Sinatra. Это то, что я всегда делаю. ActiveRecord слишком тяжел для меня.

person akonsu    schedule 25.05.2013
comment
Спасибо за подробный ответ. Что вы имеете в виду под прямым доступом к БД? Вы имеете в виду использовать гем mysql2 и передавать необработанные запросы? - person 0xSina; 25.05.2013
comment
вот сообщение о EM.Defer: stackoverflow.com/questions/10881594/ - person akonsu; 25.05.2013

Да, блокирует. Если вы используете Mysql, вы можете делать запросы, используя гем mysql2, он поддерживает асинхронные запросы. https://github.com/brianmario/mysql2

person Sergii Mostovyi    schedule 25.05.2013