#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. Я хочу, поток должен выполняться до тех пор, пока в хэш-карте не появится элемент, у вас есть какие-либо предложения по этому поводу? мое намерение состоит в том, чтобы событие «сервер не работает» должно обрабатываться потоком