Использование 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 запросов в секунду):
{width: 'new width', height: 'new heigth'}
Как я могу сделать операции Rmagick неблокирующими и вернуть результаты?
1 ответ
Похоже, вы немного перепутали.
Позвонить RMagick
всегда блокирует, так как требует обработки изображения. Хорошей новостью является призыв к grape
сам неблокирующий. Это означает, что в то время как ваши отдельные клиенты должны ждать завершения заявленных 1/3 секунд, другие клиенты все еще могут ставить запросы в очередь.
Я полагаю, что ваша среда тестирования просто вызывает соответствующую службу по очереди, ожидая завершения запросов. Вместо этого вы должны вызывать службу из отдельных потоков, получая результаты по мере их готовности.
Надеюсь, поможет.