Rails сохраняет файл с URL медленнее, чем прямой Ruby? - PullRequest
0 голосов
/ 16 марта 2012

У меня есть приложение Rails, которое сохраняет файлы в монго. Это прекрасно работает, и я настроил его для обслуживания этих файлов, но в некоторых случаях мне нужно получить файл и записать его на диск (объединение PDF-файлов).

В IRB или из простого Ruby-файла я могу запустить следующий код и получить файл практически мгновенно, но когда тот же код вызывается из Rails, он истекает.

require 'open-uri'

open('id1_front.pdf', 'wb') do |file|
  file << open('http://127.0.0.1:3000/files/uploads/id1_front.pdf').read
  p file
end

-

Timeout::Error (Timeout::Error):
  app/controllers/design_controller.rb:38:in `block in save'
  app/controllers/design_controller.rb:37:in `save'

Кто-нибудь знает, почему в Rails будет время ожидания? Какие-либо альтернативные решения, чтобы получить файл из Монго и записать его на диск?

спасибо!

1 Ответ

3 голосов
/ 16 марта 2012

Когда вы используете свой сервер разработки, у вас есть только один поток, в котором можно отвечать на запросы.Этот поток будет заблокирован при обработке запроса: поэтому вы запрашиваете design_controller # save, который затем пытается сделать еще один запрос к загруженному файлу на веб-сервере.Этот запрос никогда не будет успешно выполнен, потому что веб-сервер все еще пытается завершить предыдущий.

Вы можете обойти эту проблему, используя thin в качестве сервера Rails вместо webrick.Добавьте gem thin в ваш gemfile и запустите сервер с rails s thin.Я не уверен, что это позволит одновременно обслуживать более одного запроса, но, по крайней мере, стоит попробовать.

- РЕДАКТИРОВАТЬ -

После некоторого тестирования я определил, что тонкийк сожалению, он также однопоточный, поэтому у него будет точно такая же проблема.

После небольшого поиска, я обнаружил дробовик .Некоторое время он не был активен, но, похоже, он может решить вашу проблему, поскольку он порождает новое приложение для каждого запроса в процессе разработки.Дайте ему шанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...