[Twisted-Python] Limiting a task.Cooperator to N work units / sec

Phil Mayers p.mayers at imperial.ac.uk
Fri Oct 1 05:41:11 EDT 2010


Is there an easy way to make a task.Cooperator instance only execute N 
ticks / sec, summed across all iterators it's driving? So if you add two 
iterators, they each run at N/2 per sec, 3 at N/3, etc.

It seems like this ought to do it:

N = <rate>

def myScheduler(x):
   # reschedule N times per second
   reactor.callLater(1.0/N, x)

class myTermination:
   def __call__(self):
     # stop immediately after one iterator.next()
     return True

myCoop = task.Cooperator(
   terminationPredicateFactory=myTermination,
   scheduler=myScheduler,
)

...but this doesn't seem to work when I try it:

def mytask(name, limit):
     for i in range(limit):
         print name, time.time(), i
         yield i

def running():
     finish_a = myCoop.coiterate(mytask('a', 40))
     def start_b():
         finish_b = myCoop.coiterate(mytask('b', 10))
     reactor.callLater(6.5, start_b)

def main():
     reactor.callWhenRunning(running)
     reactor.run()

if __name__=='__main__':
     main()

...shows that, once the "b" iterator is added, each iterator is running 
1/sec, rather than the whole cooperator:

a 1285925864.05 0
a 1285925865.05 1
a 1285925866.05 2
a 1285925867.05 3
a 1285925868.05 4
a 1285925869.05 5 << running fine 1/sec up until here
b 1285925870.05 0
a 1285925870.55 6 << now running 2/sec
b 1285925871.05 1
a 1285925871.55 7
b 1285925872.05 2
a 1285925872.55 8
b 1285925873.05 3

I've had a look at the source code, and it looks like the logic should 
cause what I want to happen, but obviously it's not. Version is Twisted 
8.2.0 on python 2.6 (Fedora 12)



More information about the Twisted-Python mailing list