Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # A solution to the Twisted tutorial exercise suggested in the comment at
- # http://krondo.com/?p=1333&cpage=1#comment-20929
- import time
- from twisted.internet.task import LoopingCall
- class TaskMonitor(object):
- def __init__(self):
- self.tasks = []
- self.finishedTasks = []
- reactor.callWhenRunning(self.start)
- def register(self, task):
- task.setCallback(lambda : self.taskFinished(task))
- # task.setCallback(lambda endTime: self.taskFinished(task, endTime))
- self.tasks.append(task)
- def start(self):
- if self.tasks:
- self.startTime = time.time()
- else:
- print 'Aborting: no tasks were registered'
- self.stop()
- def taskFinished(self, task):
- endTime = time.time()
- self.tasks.remove(task)
- self.finishedTasks.append((str(task), endTime - self.startTime))
- if not self.tasks:
- reactor.callLater(0, self.stop)
- def stop(self):
- for name, elapsed in self.finishedTasks:
- print 'Task {} finished in {:.3f} sec'.format(name,elapsed)
- reactor.callLater(0, reactor.stop)
- class Countdown(object):
- def __init__(self, name, ticks, rate):
- self.name, self.counter, self.rate = name, ticks, rate
- self.callbacks = []
- self.looper = LoopingCall(self.count)
- reactor.callWhenRunning(self.start)
- def start(self):
- self.looper.start(self.rate)
- def setCallback(self, clb):
- self.callbacks.append(clb)
- def __str__(self):
- return self.name
- def count(self):
- if self.counter == 0:
- self.looper.stop()
- print 'Counter {} complete!'.format(self.name)
- for clb in self.callbacks: clb()
- else:
- print '{}: {:>2} ticks left at {} sec/tick ...'.format(self.name, self.counter, self.rate)
- self.counter -= 1
- from twisted.internet import reactor
- monitor = TaskMonitor()
- data = [['one', 5, 1.0], ['two', 13, .3], ['tri', 8, .8]]
- for name, ticks, rate in data:
- monitor.register(Countdown(name, ticks, rate))
- print 'Start!'
- reactor.run()
- print 'Stop!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement