Advertisement
Guest User

Twisted Countdown Etude 4

a guest
Dec 22nd, 2012
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.17 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-20929
  3.  
  4. import time
  5. from twisted.internet.task import LoopingCall
  6.  
  7. class TaskMonitor(object):
  8.  
  9.     def __init__(self):
  10.         self.tasks = []
  11.         self.finishedTasks = []
  12.         reactor.callWhenRunning(self.start)
  13.  
  14.     def register(self, task):
  15.         task.setCallback(lambda : self.taskFinished(task))
  16. #        task.setCallback(lambda endTime: self.taskFinished(task, endTime))
  17.         self.tasks.append(task)
  18.  
  19.     def start(self):
  20.         if self.tasks:
  21.             self.startTime = time.time()
  22.         else:
  23.             print 'Aborting: no tasks were registered'
  24.             self.stop()
  25.  
  26.     def taskFinished(self, task):
  27.         endTime = time.time()
  28.         self.tasks.remove(task)
  29.         self.finishedTasks.append((str(task), endTime - self.startTime))
  30.         if not self.tasks:
  31.             reactor.callLater(0, self.stop)
  32.  
  33.     def stop(self):
  34.         for name, elapsed in self.finishedTasks:
  35.             print 'Task {} finished in {:.3f} sec'.format(name,elapsed)
  36.         reactor.callLater(0, reactor.stop)
  37.  
  38. class Countdown(object):
  39.  
  40.     def __init__(self, name, ticks, rate):
  41.         self.name, self.counter, self.rate = name, ticks, rate
  42.         self.callbacks = []
  43.         self.looper = LoopingCall(self.count)
  44.         reactor.callWhenRunning(self.start)
  45.  
  46.     def start(self):
  47.         self.looper.start(self.rate)
  48.  
  49.     def setCallback(self, clb):
  50.         self.callbacks.append(clb)
  51.  
  52.     def __str__(self):
  53.         return self.name
  54.  
  55.     def count(self):
  56.         if self.counter == 0:
  57.             self.looper.stop()
  58.             print 'Counter {} complete!'.format(self.name)
  59.             for clb in self.callbacks: clb()
  60.         else:
  61.             print '{}: {:>2} ticks left at {} sec/tick ...'.format(self.name, self.counter, self.rate)
  62.             self.counter -= 1
  63.  
  64. from twisted.internet import reactor
  65.  
  66. monitor = TaskMonitor()
  67.  
  68. data = [['one', 5, 1.0], ['two', 13, .3], ['tri', 8, .8]]
  69. for name, ticks, rate in data:
  70.     monitor.register(Countdown(name, ticks, rate))
  71.  
  72. print 'Start!'
  73. reactor.run()
  74. print 'Stop!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement