Blame | Last modification | View Log | Download
# Written by Bram Cohen# see LICENSE.txt for license informationfrom clock import clocktry:Trueexcept:True = 1False = 0FACTOR = 0.999class RateMeasure:def __init__(self):self.last = Noneself.time = 1.0self.got = 0.0self.remaining = Noneself.broke = Falseself.got_anything = Falseself.last_checked = Noneself.rate = 0def data_came_in(self, amount):if not self.got_anything:self.got_anything = Trueself.last = clock()returnself.update(amount)def data_rejected(self, amount):passdef get_time_left(self, left):t = clock()if not self.got_anything:return Noneif t - self.last > 15:self.update(0)try:remaining = left/self.ratedelta = max(remaining/20,2)if self.remaining is None:self.remaining = remainingelif abs(self.remaining-remaining) > delta:self.remaining = remainingelse:self.remaining -= t - self.last_checkedexcept ZeroDivisionError:self.remaining = Noneif self.remaining is not None and self.remaining < 0.1:self.remaining = 0.1self.last_checked = treturn self.remainingdef update(self, amount):t = clock()t1 = int(t)l1 = int(self.last)for i in xrange(l1,t1):self.time *= FACTORself.got *= FACTORself.got += amountif t - self.last < 20:self.time += t - self.lastself.last = ttry:self.rate = self.got / self.timeexcept ZeroDivisionError:pass