如何在不使用数据库的情况下保存变量

时间:2019-10-17 03:24:32

标签: ruby-on-rails ruby multithreading ruby-on-rails-5

目前,我有一些这样的代码:

class WorkingWithThread
  def self.start_first_thread
    @@first_thread = Thread.new do
      do something
      repeat # infinitive loop
    end
  end
  def self.start_second_thread
    @@second_thread = Thread.new do
      do something
      repeat # infinitive loop
    end
  end

  def self.stop_thread
    begin
      Thread.kill @@first_thread
      Thread.kill @@second_thread
      p 'STOP THREAD'
    rescue Exception => e
      p 'NO THREAD OPENING'
    end
  end
end

最大线程池为3,超时= 600秒。我发出了2个api请求来启动和停止线程。

它正常工作。但是,如果启动api被调用两次,则变量 @@ first_thread @@ second_thread 似乎已重新初始化,并且那些正在运行的线程无法杀死。此外,有时过后,即使我仅一次调用了启动api,stop api也无法正常工作(我在这里需要解释)。

问题是:

  1. 如何存储线程变量,这样就可以在不使用数据库的情况下将其停止?

  2. 我正在考虑在运行线程时添加方法来阻止启动api?可行吗?如果是的话,如何停止这些线程作为我上面提到的无法解释的原因?

1 个答案:

答案 0 :(得分:1)

为什么不实例化该类的实例并在其中存储正在运行的线程?例如:

class WorkingWithThread
  attr_accessor :first_thread, :second_thread

  def run
    start_first_thread
    start_second_thread
  end

  def start_first_thread
    return puts("First thread already running") if self.first_thread

    puts "Launching thread one!"
    self.first_thread = Thread.new do
      # do something
      repeat # infinite loop
    end
  end

  def start_second_thread
    return puts("Second thread already running") if self.second_thread

    puts "Launching thread two!"
    self.second_thread = Thread.new do
      # do something
      repeat # infinite loop
    end
  end

  def stop_threads
    begin
      Thread.kill first_thread if first_thread
      Thread.kill second_thread if second_thread
      p 'STOP THREADS'
    rescue Exception => e
      p 'NO THREADS OPENING'
    end
  end
end

然后使用它:

worker = WorkingWithThread.new
worker.run
# => Launching thread one!
# => Launching thread two!

worker.run
# => First thread already running
# => Second thread already running

worker.stop_threads
# => STOP THREADS

这样,您将可以始终访问正在运行的线程-让我知道是否有帮助以及您如何继续:)

相关问题