Тонкий EventMachine Синатра против Rails - PullRequest
9 голосов
/ 21 февраля 2011

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

Когда я запускаю следующий код на тонком веб-сервере, он ведет себя как ожидалось.Первый запрос возвращается немедленно, а второй запрос ожидает завершения 3-секундного неактивного вызова.Это ожидаемое поведение.

class EMSinatra < Sinatra::Base
  get "/" do
    EM.next_tick { sleep 3 }
    "Hello"
  end
end

В то время как в Rails 3 работает, я пытаюсь сделать то же самое: (работает под thin)

class EmController < ApplicationController
  def index
    EM.next_tick {
      sleep(3)
    }
  end
end

В Rails вызов сна происходит раньшевизуализация представления в браузере.В результате я жду 3 секунды, чтобы начальная страница отобразилась.

Кто-нибудь знает, почему это происходит?Я не ищу комментарии о том, хорошая это практика или нет.Я просто экспериментирую.Бросать маленькие задачи в петлю реактора кажется интересной вещью.Зачем клиенту ждать, если я собираюсь сделать неблокирующие http-запросы?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Я не уверен, что это ответ, который вы ищете, но я провел некоторое исследование по этому вопросу раньше. Позвольте мне рассказать вам немного справочной информации: Мы хотели добиться того, чтобы рельсы уже очищали части дерева шаблонов (например, первую часть макета), даже если загрузка контроллера занимает много времени. В результате пользователь уже видит что-то в своем браузере, пока веб-сервер все еще работает. Конечно, главное представление должно ждать с рендерингом, потому что ему, вероятно, нужны данные от действия контроллера.

Этот метод также известен как BigPipe, и Facebook написал хороший блог об этом: http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919

Так или иначе, после некоторого исследования, чтобы достичь этого для рельсов 3, я нашел это сообщение в блоге, сделанное Иегудой Кацем. http://yehudakatz.com/2010/09/07/automatic-flushing-the-rails-3-1-plan/

Так что сейчас я думаю, что вы действительно должны придерживаться ожидания контроллера

0 голосов
/ 06 октября 2012

Использование EM.defer вместо EM.next_tick приводит к возникновению сна после отправки ответа.

...