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 занимается какой-то хуйней вместо того, чтобы чуть-чуть подумать передней головой.
