Как сохранить переменную без использования базы данных в ruby - PullRequest
3 голосов
/ 17 октября 2019

В настоящее время у меня есть такой код:

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 вызывается 2 раза, переменные @@ first_thread и @@ second_thread кажутся переинициализированными, и эти запущенные потоки не могут быть уничтожены. Кроме того, через некоторое время иногда api stop также не работает, даже когда я вызываю start api только один раз (здесь мне нужно пояснение).

Вопросы:

  1. Как сохранить переменные потока, чтобы я мог остановить их без использования базы данных?

  2. I 'я думаю о добавлении метода для блокировки запуска API, когда есть запущенные потоки? Это жизнеспособно? Если это так, как остановить эти потоки, когда это происходит по необъяснимой причине, о которой я упоминал выше?

1 Ответ

1 голос
/ 17 октября 2019

Почему бы не создать экземпляр класса и сохранить там запущенные потоки? Например:

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

Таким образом, вы будете иметь доступ к работающим потокам на всем протяжении - дайте мне знать, если это поможет и как вы продолжаете:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...