Использование 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 секунд, другие клиенты все еще могут ставить запросы в очередь.

Я полагаю, что ваша среда тестирования просто вызывает соответствующую службу по очереди, ожидая завершения запросов. Вместо этого вы должны вызывать службу из отдельных потоков, получая результаты по мере их готовности.

Надеюсь, поможет.

Другие вопросы по тегам