【问题标题】:How to launch a thread at the start of a rails app and terminate it at stop如何在 Rails 应用程序开始时启动线程并在停止时终止它
【发布时间】:2011-07-29 12:51:48
【问题描述】:

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

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

有自动的方法吗?或者我应该把铁轨挡住吗?怎么样?

提前感谢您的建议。

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

【问题讨论】:

    标签: ruby-on-rails multithreading pid


    【解决方案1】:

    (老问题,但我不喜欢没有答案的问题 ;-)

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

    1. 在“config/initializers”目录附近创建一个“config/finalizers”目录。
    2. 将此代码放入初始化程序中:

    (我们在“退出”时使用 ruby​​,参见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。然后我们可以在“终结器”中使用类似的东西:(这里我们试图阻止应该在初始化器中启动的“工人”)

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

    【讨论】:

      【解决方案2】:

      您是否尝试过将您的应用包装在 begin.. 确保像这样:

      begin
        thread = start_thread
        rest_of_app
      ensure
        thread.kill
      end
      

      【讨论】:

      • 谢谢,但我对将我的 Rails 应用程序包装在 begin .. end 中感到难过。一定有更好的办法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多