#!/usr/bin/env python import sys class Obj: def __init__(self, parent, name): self.parent = parent self.name = name if parent: setattr(parent, name, self) def get_name(self): me = self.name if self.name else '' pa = self.parent.get_name() + '.' if self.parent else '' return pa + me class Foo(Obj): def __init__(self, parent, latency=None): Obj.__init__(self, parent, 'foo') self.latency = latency self.v = 0 sched.enque( latency, self.add, (0, ) ) def add(self, a): self.v += a msg = '{} v={}'.format( self.get_name(), self.v ) dbgout(msg) if self.v < 55: sched.enque( self.latency, self.add, (a+1,) ) class Sched: def __init__(self): self.que = [] self.now = 0 def enque(self, latency, f, args=() ): tm = self.now if latency: tm = tm + latency t = (tm, f, args) n = len(self.que) while n > 0: (tm_n, _, _) = self.que[ n - 1 ] if tm >= tm_n: break n -= 1 self.que.insert(n, t) def main_loop(self): while len(self.que) > 0: (tm, f, args) = self.que.pop(0) self.now = tm f(*args) def dbgout(s, always=False): if always or '-v' in sys.argv: print '{} {}'.format( sched.now, s ) sys.stdout.flush() if __name__ == "__main__": sched = Sched() o = Obj(None, 'o') Foo(o) slow = Obj(o, 'slow') Foo(slow, 10) slow_12 = Obj(o, 'slow_12') Foo(slow_12, 12) sched.main_loop() # EOF