я изучал возможность фонового выполнения некоторых заданий с помощью EventMachine. В Sinatra это, кажется, отлично работает, но Rails 3, кажется, выполняет все тики перед рендерингом представления.
Когда я запускаю следующий код на тонком веб-сервере, он ведет себя так, как ожидалось. Первый запрос возвращается немедленно, а второй запрос ожидает завершения 3-секундного вызова сна. Это ожидаемое поведение.
class EMSinatra < Sinatra::Base
get "/" do
EM.next_tick { sleep 3 }
"Hello"
end
end
В то время как в запущенном Rails 3 я пытаюсь сделать то же самое: (работает в тонком режиме)
class EmController < ApplicationController
def index
EM.next_tick {
sleep(3)
}
end
end
В Rails вызов сна происходит до рендеринга представления в браузере. В результате я жду 3 секунды для отображения начальной страницы.
Кто-нибудь знает, почему это происходит? Я не ищу комментариев, является ли это хорошей практикой или нет. Я просто экспериментирую. Добавление небольших задач в цикл реактора кажется интересным. Зачем клиенту ждать, если я собираюсь сделать несколько неблокирующих http-запросов?