如何在 Rails 应用程序启动时启动线程并在停止时终止它

发布于 2024-10-30 08:33:20 字数 285 浏览 2 评论 0原文

我想在我的 Rails 应用程序开始时自动启动后台线程并在停止时终止它(开发模式中的 Ctrl + C 或生产中的终止信号)

我在启动时启动线程没有问题,但我不能设法在停止时终止它。要么它不会停止,要么它阻止我的 Rails 应用程序退出。

有自动的方法吗?或者我应该钩住铁轨挡块吗?如何 ?

预先感谢您的建议。

PS 顺便问一下,你知道如何使用rails线程的“pid”功能吗?我的意思是在启动时将一个小文本文件放入 tmp/pids 并自动删除它的方法。我确信有一些函数可以做到这一点。

I would like to automatically launch a background thread at the start of my rails app and terminate it at stop (Ctrl + C in dev mode or kill signal in production)

I've no problem launching my thread at start, but I can't manage to terminate it at stop. Either it doesn't stop, either it prevent my rails app from quitting.

Is there an automatic way ? Or should I hook the rails stop ? How ?

Thanks in advance for your advices.

P.S. By the way, do you know how to use the "pid" feature of the rails thread ? I mean the way to put a small text file in tmp/pids at start and removing it automatically. I'm sure there are some functions to do that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

毁虫ゝ 2024-11-06 08:33:20

(老问题,但我不喜欢未回答的问题;-)

一个方便的方法是设置类似于 Rails“初始化器”的“终结器”。然后,您可以在初始化程序中启动线程并在终结程序中关闭它们。

  1. 在“config/initializers”目录附近创建“config/finalizers”目录。
  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. 然后我们可以在“终结器”中使用类似的东西:(这里我们尝试阻止据称在初始化器中启动的“workers”)

if Settings.web_app.engine.workers_count != 0 && Settings.web_app.engine.auto_manage_workers then
   puts '    * Automatic shutdown of workers'
   ...
end

(Old question, but I don't like unanswered questions ;-)

A convenient way to do this is to set "finalizers" similar to rails "initializers". You can then launch threads in initializers and close them in finalizers.

  1. Create a "config/finalizers" directory near the "config/initializers" directory.
  2. put this code in an initializer :

(we use ruby "at exit", cf. Shutdown hook for 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. Then we can use something like that in a "finalizer" : (here we attempt to stop "workers" supposedly launched in initializers)

if Settings.web_app.engine.workers_count != 0 && Settings.web_app.engine.auto_manage_workers then
   puts '    * Automatic shutdown of workers'
   ...
end
回眸一笑 2024-11-06 08:33:20

您是否尝试过将您的应用程序包装在开始中......确保像这样:

begin
  thread = start_thread
  rest_of_app
ensure
  thread.kill
end

Have you tried wrapping your app in a begin..ensure like this:

begin
  thread = start_thread
  rest_of_app
ensure
  thread.kill
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文