threadpool.py
author Fabien Ninoles <fabien@tzone.org>
Mon, 07 Jun 2010 23:56:53 -0400
changeset 6 6657247ddbbf
parent 2 a00ae018daf8
permissions -rw-r--r--
Add slightly better command line handling.

#!/usr/bin/env python2.6

import threading
import logging
import Queue

class _Worker(threading.Thread):
    def __init__(self, uid, pool):
        threading.Thread.__init__(self, name = "Worker%d" % uid)
        self.pool = pool
    def run(self):
        logging.info("%s started", self.getName())
        while True:
            job = self.pool.jobs.get()
            if job:
                logging.debug("%s is running %r", self.getName(), job)
                try:
                    job()
                except:
                    logging.exception("Job %r return an exception", job)
                logging.debug("Job %r completed.", job)
            else:
                self.pool.jobs.put(job)
                break
        logging.info("%s stopped", self.getName())


##
# A basic worker pool... should be replaced with a resizable one.
class ThreadPool(object):
    Worker = _Worker
    
    def __init__(self, size):
        super(ThreadPool, self).__init__()
        self.jobs = Queue.Queue()
        self._workers = [self.Worker(x+1, self) for x in xrange(size)]

    def Start(self):
        logging.info("Starting Workers pool")
        for worker in self._workers:
            worker.start()
        logging.info("Workers started")

    def Stop(self, now = False):
        logging.info("Stopping Workers")
        if now:
            self.jobs = Queue.Queue()
        self.jobs.put(None)
        for worker in self._workers:
            worker.join()
        logging.info("Workers stopped")

    def AddJob(self, job):
        self.jobs.put(job)