Как выполнить какую-то задачу после рендера в Rails 3.1 - PullRequest
12 голосов
/ 17 ноября 2011

Я использую Impressionist для записи показов страниц. Запись в базу данных занимает всего около 50 мс, но я действительно предпочел бы сделать это после того, как страница будет обработана и отправлена ​​клиенту.

Я изучал разветвление с помощью Spawn , но он устанавливает новое соединение с базой данных, которое кажется излишним для такой небольшой работы. Задержка задания и другие библиотеки фоновой обработки выглядят как major overkill. Запись в базу данных только для того, чтобы отложить запись в базу данных ... не победа.

Хотел бы я просто:

def show
  render
  impressionist(@article)
end

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

Есть какие-нибудь решения? Запуск Rails 3.1 и Ruby 1.9.2 на Heroku Cedar.

Ответы [ 6 ]

6 голосов
/ 19 февраля 2013

Создать новую тему. Heroku позволит вам до 15 потоков на динамо.

def show
  render
  Thread.new do
    impressionist(@article)
  end
end
1 голос
/ 21 июля 2016

Лично я не рекомендовал бы запускать "Thread new" из действия и затем передавать в фоновый поток ссылку на элемент (ы), которые все еще обрабатываются в другом потоке. Это очень быстро приводит к неприятным невоспроизводимым ошибкам из-за конфликтов между потоками.

1 голос
/ 20 февраля 2013

Это пришло и выглядит многообещающе: https://github.com/brandonhilkert/sucker_punch

Брэндон твердый чувак. Не могу дождаться, чтобы попробовать Sucker Punch out!

1 голос
/ 24 января 2012

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

0 голосов
/ 04 ноября 2013

Я думаю, вы можете использовать after_filter функцию обратного вызова

class ApplicationController < ActionController::Base

  after_filter :after_filter_cb

  def after_filter_cb
    # Some logic
  end

end
0 голосов
/ 20 ноября 2011

Как насчет входа на что-то немного более быстрое, например, на mongodb, или вы можете подумать о сохранении хэша в redis (ультрабыстром) и запускать пакетное задание каждый час или около того, чтобы сохранить их в вашей базе данных postgres. При использовании обоих этих вариантов вам придется взломать импрессионистов или использовать собственное решение, которое, как вы предлагали в случае фоновых решений (delayed_job, resque и т. Д.), Может оказаться излишним в зависимости от размера вашего проекта.

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