Как добавить / удалить элемент из хэша, который используется потоком

#ruby

#ruby

Вопрос:

Я пытаюсь добавить элемент в хэш, который используется потоком, он выдает ошибку ниже linkEvent’: не удается добавить новый ключ в хэш во время итерации (RuntimeError)

 @serverDown = Hash.new
def eventMessage(message)

  @server_thread = Thread.new do
        until @serverDown.empty?
          @serverDown.each do |key, value|
              puts "#{key}"
              sleep 3
        end
          Thread.stop if @serverDown.empty?
      end
    end
  end

  if message.include?("down")
    state = message.split.last
    puts "Adding #{state} to hash"
    @serverDown[state] = Time.now.to_i
    @server_thread.wakeup unless @server_thread.alive?
  end
end

@queue = Queue.new
@queue << "server is down"
@queue << "server is down"
@queue << "server is down"
@queue << "server is up"
@equeue << "unreachable"

until @queue.empty?
  event = @queue.pop
  if event.include?("down") || event.include?("up")
    eventMessage(event)
    sleep 3
    next
  end
  puts "#{event}"
end
  

Я хочу заблокировать поток и добавить элемент в хэш, а затем возобновить поток.

Комментарии:

1.Вам нужен мьютекс и условная переменная вокруг @serverDown.each и вокруг @serverDown[state] = ... .

2. Я пытался, но не добился успеха, если вы не возражаете, можете ли вы, пожалуйста, привести какой-нибудь пример кода для использования мьютекса в соответствии с моим требованием

3. Здесь есть пример. Кстати, вы уверены, что Thread.new вызов должен проходить внутри eventMessage функции? Вы запускаете новый поток прослушивателя каждый раз, когда вызывается функция.

4. Я хочу, поток должен выполняться до тех пор, пока в хэш-карте не появится элемент, у вас есть какие-либо предложения по этому поводу? мое намерение состоит в том, чтобы событие «сервер не работает» должно обрабатываться потоком