Как запустить поток в начале приложения rails и завершить его при остановке - PullRequest
1 голос
/ 05 апреля 2011

Я хотел бы автоматически запустить фоновый поток в начале моего приложения rails и завершить его при остановке (Ctrl + C в режиме разработки или сигнал уничтожения в процессе работы)

У меня нет проблем с запуском моей темы при запуске, но я не могу завершить ее при остановке. Либо это не останавливает, либо предотвращает выход из моего приложения rails.

Есть ли автоматический способ? Или я должен остановить крючки? Как?

Заранее спасибо за советы.

P.S. Кстати, вы знаете, как использовать функцию "pid" нити рельсов? Я имею в виду способ поместить небольшой текстовый файл в tmp / pids при запуске и удалить его автоматически. Я уверен, что для этого есть некоторые функции.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

(Старый вопрос, но мне не нравятся вопросы без ответа; -)

Удобный способ сделать это - установить "финализаторы", аналогичные "инициализаторам" rails.Затем вы можете запускать потоки в инициализаторах и закрывать их в финализаторах.

  1. Создайте каталог " config / finalizers " рядом с каталогом " config / initializers ".
  2. поместите этот код в инициализатор:

(мы используем ruby ​​"на выходе", ср. Отключаемая ловушка для Rails )

at_exit do
   finalizer_files = File.join(::Rails.root.to_s, "config/finalizers/*.rb")
   Dir.glob(finalizer_files).sort.each do |finalizer_file|
      require finalizer_file
   end
end

3.Затем мы можем использовать что-то подобное в «финализаторе»: (здесь мы пытаемся остановить «работников», предположительно запущенных в инициализаторах)

if Settings.web_app.engine.workers_count != 0 && Settings.web_app.engine.auto_manage_workers then
   puts '    * Automatic shutdown of workers'
   ...
end
1 голос
/ 05 апреля 2011

Вы пробовали обернуть ваше приложение в начале ... убедитесь, что это так:

begin
  thread = start_thread
  rest_of_app
ensure
  thread.kill
end
...