これは私には本当に奇妙です。何時間もイライラしています。RUN リクエストを受信すると、RUNNER は永久に実行されるバックグラウンド スレッドを開始します。いつでも、実行中のスレッドは 1 つだけです (私はミューテックスを使用しています)。問題は、ステータス リクエストの場合、 true を返す場合と false を返す場合があることです。
(バックエンド スレッドは永久に実行されるため、done メソッドが呼び出されることはありません。したがって、is_running? が false になる可能性はありません)
#config/initializers/some_init.rb
RUNNER = Runner.instance
#app/controllers/some_controller.rb
class SomeController < ApplicationController
def run
RUNNER.run {
loop do
Rails.logger.debug "backend thread running #{Time.zone.now}"
sleep(5)
end
}
end
def status
Rails.logger.debug RUNNER.inspect
RUNNER.is_running?
end
end
#lib/runner.rb
require 'singleton'
class Runner
include Singleton
def initialize
@running = false
@mutex = Mutex.new
end
def run(&blk)
@mutex.synchronize do
return if @running #only one job run is allowed at anytime
@running = true
@thr = Thread.new(self) do |r|
blk.call
r.done
end
end
end
def is_running?
@mutex.synchronize{ @running }
end
private
def done
@mutex.synchronize {@running = false}
end
end