Welcome, guest | Sign In | My Account | Store | Cart
from collections import deque

class Task:
    def __init__(self, pool):
        self.generator = self.main()
        pool.add(self)
    def main(self):
        "Must be a generator"
        pass

class TaskPool:
    """
    NOTE max speed ~~ 20000 task switches per second per 100MHz
    NOTE using pyrex or psyco ~~ 25% speed improvement
    NOTE ram usage ~~ 1KB per task
    """
    def __init__(self):
        self.tasks = deque()
    def add(self, task):
        self.tasks.append(task)
    def iteration(self, iter_cnt=1):
        tasks = self.tasks
        for i in range(iter_cnt):
            try:
                tasks[0].generator.next()
                tasks.rotate(-1)
            except StopIteration:
                del tasks[0]
            except IndexError:
                # allow internal exception to propagate
                if len(tasks) > 0: raise


#### EXAMPLE #########################################################

class ExampleTask(Task):
    def __init__(self, pool, name, max_iterations):
        self.name = name
        self.max_iterations = max_iterations
        Task.__init__(self, pool)
    def main(self):
        i = 0
        while i < self.max_iterations:
            print self.name, i
            i += 1
            yield 0
        print self.name, 'finishing'

pool = TaskPool()
task_a = ExampleTask(pool, 'AAA',  5)
task_b = ExampleTask(pool, 'bbb', 10)
for i in xrange(100):
    pool.iteration()

History

  • revision 3 (18 years ago)
  • previous revisions are not available