2013-12-05 3 views
0

Мои отчеты о создании приложений основаны на данных, собранных из внешних API, что может занять несколько минут. Естественно, я не хочу блокировать рабочий процесс. Возможно ли отправить сбор данных на задний план и позволить пользователю работать с приложением дальше? Также будет хорошо отображать состояние задания с помощью SSE или WebSockets.неблокирующий ввод-вывод в рубинах на рельсах

ответ

1

Обычно вы бы направить фоновое задание на к Resque или другой фоновой очереди заданий, и ваш работник выполняет задания из очереди.

Это выглядит следующим образом:

class ReportGenerationJob 
    # ... 

    def work 
    # do expensive operations here 
    end 
end 

r = Resque.new 
r << ReportGenerationJob.new(...) # Not a blocking operation! 

После того, как данная работа будет завершена, ваш работник может затем сигнализировать, когда это делается в некоторых полезным способом (например, по электронной почте пользователю, что завершена работа, при записи значение «сделано!» в вашей базе данных и т. д.).

+0

но как я могу отправить WebSocket или SSE при завершении задания? Есть ли какое-то «обещание» или что-то доступное? Я имею в виду, не должен ли я ждать, пока он будет полным, что будет дискредитировать материал resque? – lessless

+1

Существует много разных способов сделать это, и это будет зависеть от того, на какой платформе вы находитесь, и на ваших других требованиях. Одна статья, которая может быть полезна, находится здесь: http://www.bytelion.com/blog/rails-app-with-html5-websockets/ –

Смежные вопросы