RateMeasure.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # Written by Bram Cohen
  2. # see LICENSE.txt for license information
  3. from clock import clock
  4. try:
  5. True
  6. except:
  7. True = 1
  8. False = 0
  9. FACTOR = 0.999
  10. class RateMeasure:
  11. def __init__(self):
  12. self.last = None
  13. self.time = 1.0
  14. self.got = 0.0
  15. self.remaining = None
  16. self.broke = False
  17. self.got_anything = False
  18. self.last_checked = None
  19. self.rate = 0
  20. self.lastten = False
  21. def data_came_in(self, amount):
  22. if not self.got_anything:
  23. self.got_anything = True
  24. self.last = clock()
  25. return
  26. self.update(amount)
  27. def data_rejected(self, amount):
  28. pass
  29. def get_time_left(self, left):
  30. t = clock()
  31. if not self.got_anything:
  32. return None
  33. if t - self.last > 15:
  34. self.update(0)
  35. try:
  36. remaining = left/self.rate
  37. if not self.lastten and remaining <= 10:
  38. self.lastten = True
  39. if self.lastten:
  40. return remaining
  41. delta = max(remaining/20,2)
  42. if self.remaining is None:
  43. self.remaining = remaining
  44. elif abs(self.remaining-remaining) > delta:
  45. self.remaining = remaining
  46. else:
  47. self.remaining -= t - self.last_checked
  48. except ZeroDivisionError:
  49. self.remaining = None
  50. if self.remaining is not None and self.remaining < 0.1:
  51. self.remaining = 0.1
  52. self.last_checked = t
  53. return self.remaining
  54. def update(self, amount):
  55. t = clock()
  56. t1 = int(t)
  57. l1 = int(self.last)
  58. for i in xrange(l1,t1):
  59. self.time *= FACTOR
  60. self.got *= FACTOR
  61. self.got += amount
  62. if t - self.last < 20:
  63. self.time += t - self.last
  64. self.last = t
  65. try:
  66. self.rate = self.got / self.time
  67. except ZeroDivisionError:
  68. pass