Я пытаюсь создать очень простой веб-сервис с Goliath и Grape. Все, что мой сервис будет делать, это то, что с учетом пути изображения и целевого измерения он вернет новую геометрию изображения. Изображения хранятся на том же сервере, что и хост веб-службы.Использование Rmagick с eventmachine
Так у меня есть этот код в Grape:
# some Grape code omitted
get "/" do
EM.defer {
image = Magick::Image.read('path to image').first
image.change_geometry('3000x3900') do |cols, row, img|
return {width: cols, height: row}
end
}
end
Когда я посещаю конечную точку в браузере все, что я получаю эту строку
"#<ConditionVariable:0x007ffd9de1f6e8>"
Без EM.defer возвращает следующий JSON, но с очень низкими запросами/сек (около 4 Reqs/сек):
{width: 'new width', height: 'new heigth'}
Как я мог сделать оперу RMagick не блокируя и заставляя его возвращать результаты?
См. Http://eventmachine.rubyforge.org/EventMachine.html#defer-class_method, параметр 'op' является' & block' из вашего кода, он выполняется в отдельном потоке, параметр 'callback' на другом рука - это блок кода, который запускает реактор, как только «EM.defer» возвращает результат. Посмотрите, сможете ли вы вернуть ответ из блока обратного вызова EM.defer. – bbozo