Advertisement
yang_w

Twisted countdown loopingcall solution

Feb 11th, 2014
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.51 KB | None | 0 0
  1. from twisted.internet.task import LoopingCall
  2.  
  3. class Manager:
  4.    
  5.     def __init__(self):
  6.         self._token = {}
  7.        
  8.     def register(self, tasks):
  9.         if not type(tasks) is list:
  10.             tasks = [tasks]
  11.         for task in tasks:
  12.             self._token[task.Name()] = LoopingCall(task.Job(), self.finalize)
  13.        
  14.     def start(self, schedule):
  15.         if not type(schedule) is list:
  16.             schedule = [schedule]
  17.         for task, timer in schedule:
  18.             self._token[task.Name()].start(timer, False)
  19.            
  20.     def finalize(self, task):
  21.         self._token[task.Name()].stop()
  22.         del self._token[task.Name()]
  23.         if not self._token:
  24.             reactor.stop()
  25.                        
  26. class Countdown(object):
  27.  
  28.     def __init__(self, name, start):
  29.         self.name = name
  30.         self.counter = start
  31.        
  32.     def Name(self):
  33.         return self.name
  34.        
  35.     def Job(self):
  36.         return self.count
  37.        
  38.     def count(self, finallize=lambda x: None):
  39.         print 'counter %s:' % str(self.name), self.counter, '...'
  40.         if self.counter == 0:
  41.             finallize(self)
  42.             print 'counter %s finished!' % str(self.name)
  43.         else:
  44.             self.counter -= 1
  45.  
  46. mng = Manger()
  47. cntA = Countdown('AAA', 5)
  48. cntB = Countdown('BB', 10)
  49. cntC = Countdown('C', 7)
  50.  
  51. mng.register(cntA)
  52. mng.register([cntB, cntC])
  53.  
  54. mng.start([(cntA, 1), (cntB, 0.3)])
  55. mng.start((cntC, 0.5))
  56.  
  57. from twisted.internet import reactor
  58. reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement