Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import traceback
- from twisted.internet.task import LoopingCall
- class Manager:
- def __init__(self):
- self._job2loop = {}
- def register(self, *tasks):
- for task in tasks:
- self._job2loop[task.name] = LoopingCall(self.run_job, task)
- def start(self, *schedule):
- for task, timer in schedule:
- if task.name in self._job2loop:
- self._job2loop[task.name].start(timer, False)
- print 'Job %s started' % task.name
- else:
- print 'Job not scheduled: %s' % task.name
- def run_job(self, task):
- job = task.job()
- try:
- job()
- except Exception, e:
- self.exception_handler(task, e)
- else:
- if task.job_done():
- self.finalize(task)
- def exception_handler(self, task, e):
- print 'Exception happened in %s.%s' % (task.name, task.job().__name__)
- print e
- print traceback.format_exc()
- self.finalize(task)
- def finalize(self, task):
- self._job2loop[task.name].stop()
- del self._job2loop[task.name]
- print '%s finalized' % task.name
- if not self._job2loop:
- reactor.stop()
- class Countdown(object):
- def __init__(self, name, start):
- self.name = name
- self.counter = start
- def job_done(self):
- if not self.counter:
- return True
- return False
- def job(self):
- return self.count
- def count(self):
- if self.counter <= 0:
- raise ValueError, '%s.counter = %d, value must be greater than 0' % (self.name, self.counter)
- print 'counter %s:' % str(self.name), self.counter, '...'
- self.counter -= 1
- cntA = Countdown('AAA', 5)
- cntB = Countdown('BB', 10)
- cntC = Countdown('C', 7)
- cntErr = Countdown('Err', 0)
- mng = Manager()
- mng.register(cntA, cntB, cntC, cntErr)
- mng.start((cntA, 1), (cntB, 0.3))
- mng.start((cntC, 0.5), (cntErr, 1))
- from twisted.internet import reactor
- reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement