henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2011-07-17 03:11 am

Someone Who is Not Cool in General

В виртуальной машинке с федорой, где я собираю gem'ы для пушания, внезапно обнаружилось, что ntpd в ней давно скацапузился и время из-за этого текло медленно и неторопливо. Например, вчера там было 29 апреля.

А еще yours truly--феерический идиот. Положим, мы имеем n тредов + 1 тред для мониторинга, который каждые k секунд собирает из тех тредов разную статистику.

def alarm(thread_pool, time)
  Thread.new(thread_pool) { |tp|
    loop {
      tp.each {|i|
        # grabbing the staff
        # ...
      }

      break if alldone?(tp)
      sleep time
    }
  }
end

alldone? просто проверят статус каждого треда и возвращает true, если никого в живых не осталось.

Дальше пишется, я извеняюсь, такое:

t = []
a = alarm(t, 2) # ME IS A PATHETIC IDIOT

8.times {|i|
  t[i] = MyThread.new(i) {
     # ...
     if some_boring_staff
       MyThread.current.stat.ok += 1
     else
       MyThread.current.stat.failed += 1
     end
  }
}

t.map(&:join)
a.join

На что, разумеется, alldone? радостно отвечает "ага!" и никто никакой статистики не получает.

Что делает yours trully, вместо того, чтобы перенести создание мониторингово треда после создания отех 8? Yours truly вставляет в alarm счетчик лупов и дает выйти из него только по прошествии 3-х (тогда 8 тредов точно начинают работать и alldone? уже вещает правду); yours truly пишет в документации про "особенность" ждания нескольких секунд; короче, yours truly занимается какой-то хуйней вместо того, чтобы чуть-чуть подумать передней головой.