Guest User

Twisted Countdown Etude 3

a guest
Dec 21st, 2012
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.18 KB | None | 0 0
  1. # A solution to the Twisted tutorial exercise suggested in the comment at
  2. # http://krondo.com/?p=1333&cpage=1#comment-20927
  3.  
  4. import time
  5. from twisted.internet.task import LoopingCall
  6.  
  7. class CountdownMonitor(object):
  8.  
  9.     def __init__(self, rate=.2):
  10.         self.rate = .2
  11.         self.countdowns = []
  12.         self.finishedCountdowns = []
  13.         self.looper = LoopingCall(self.poll)
  14.  
  15.     def register(self, ctdn):
  16.         self.countdowns.append(ctdn)
  17.         reactor.callWhenRunning(ctdn.start)
  18.  
  19.     def start(self):
  20.         self.startTime = time.time()
  21.         self.looper.start(self.rate)
  22.  
  23.     def poll(self):
  24.         for ctdn in self.countdowns:
  25.             endTime = ctdn.endTime
  26.             if endTime:
  27.                 self.countdowns.remove(ctdn)
  28.                 self.finishedCountdowns.append((ctdn.name, endTime - self.startTime))
  29.  
  30.         if not self.countdowns:
  31.             for c, t in self.finishedCountdowns:
  32.                 print 'Countdown {} finished in {:.3f} sec'.format(c,t)
  33.             reactor.callLater(0, reactor.stop)
  34.  
  35. class Countdown(object):
  36.  
  37.     def __init__(self, name, ticks, rate):
  38.         self.name, self.counter, self.rate = name, ticks, rate
  39.         self.looper = LoopingCall(self.count)
  40.         self.endTime = None
  41.  
  42.     def start(self):
  43.         self.looper.start(self.rate)
  44.  
  45.     def count(self):
  46.         if self.counter == 0:
  47.             self.endTime = time.time()
  48.             self.looper.stop()
  49.             print 'Counter {} complete!'.format(self.name)
  50.         else:
  51.             print '{}: {:>2} ticks left at {} sec/tick ...'.format(self.name, self.counter, self.rate)
  52.             self.counter -= 1
  53.  
  54. from twisted.internet import reactor
  55.  
  56. monitor = CountdownMonitor()
  57. reactor.callWhenRunning(monitor.start)
  58.  
  59. data = [['one', 5, 1.0], ['two', 13, .3], ['tri', 8, .8]]
  60. for name, ticks, rate in data:
  61.     monitor.register(Countdown(name, ticks, rate))
  62.  
  63. print 'Start!'
  64. reactor.run()
  65. print 'Stop!'
  66.  
  67.  
  68.  
  69. #### Output ####
  70.  
  71. Start!
  72. one:  5 ticks left at 1.0 sec/tick ...
  73. two: 13 ticks left at 0.3 sec/tick ...
  74. tri:  8 ticks left at 0.8 sec/tick ...
  75. two: 12 ticks left at 0.3 sec/tick ...
  76. two: 11 ticks left at 0.3 sec/tick ...
  77. tri:  7 ticks left at 0.8 sec/tick ...
  78. two: 10 ticks left at 0.3 sec/tick ...
  79. one:  4 ticks left at 1.0 sec/tick ...
  80. two:  9 ticks left at 0.3 sec/tick ...
  81. two:  8 ticks left at 0.3 sec/tick ...
  82. tri:  6 ticks left at 0.8 sec/tick ...
  83. two:  7 ticks left at 0.3 sec/tick ...
  84. one:  3 ticks left at 1.0 sec/tick ...
  85. two:  6 ticks left at 0.3 sec/tick ...
  86. two:  5 ticks left at 0.3 sec/tick ...
  87. tri:  5 ticks left at 0.8 sec/tick ...
  88. two:  4 ticks left at 0.3 sec/tick ...
  89. one:  2 ticks left at 1.0 sec/tick ...
  90. two:  3 ticks left at 0.3 sec/tick ...
  91. tri:  4 ticks left at 0.8 sec/tick ...
  92. two:  2 ticks left at 0.3 sec/tick ...
  93. two:  1 ticks left at 0.3 sec/tick ...
  94. Counter two complete!
  95. one:  1 ticks left at 1.0 sec/tick ...
  96. tri:  3 ticks left at 0.8 sec/tick ...
  97. tri:  2 ticks left at 0.8 sec/tick ...
  98. Counter one complete!
  99. tri:  1 ticks left at 0.8 sec/tick ...
  100. Counter tri complete!
  101. Countdown two finished in 3.900 sec
  102. Countdown one finished in 5.000 sec
  103. Countdown tri finished in 6.400 sec
  104. Stop!
Advertisement
Add Comment
Please, Sign In to add comment