X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fthreadpool.py;h=f1b68ce2e9bb4088222e2b0227a9793fafadafcd;hb=d8056122484c9767c601f66587e6c6d955bd6420;hp=41ae34319a1c004155a20217454c97384fa396bf;hpb=57619bfe35eba89e6b0f2d2383e91590ff156763;p=dak.git diff --git a/daklib/threadpool.py b/daklib/threadpool.py index 41ae3431..f1b68ce2 100644 --- a/daklib/threadpool.py +++ b/daklib/threadpool.py @@ -1,19 +1,26 @@ -import threading -from time import sleep +""" +thread pool implementation for Python -from daklib.config import Config +@contact: Debian FTPMaster +@copyright: 2003 Tim Lesher +@copyright: 2004 Carl Kleffner +@copyright: 2010, 2011 Torsten Werner +""" # This code is a modified copy of # http://code.activestate.com/recipes/203871-a-generic-programming-thread-pool/ # and is licensed under the Python License. The full text of the license # is available in the file COPYING-PSF. -# Ensure booleans exist (not needed for Python 2.2.1 or higher) -try: - True -except NameError: - False = 0 - True = not False +import threading +from time import sleep + +from daklib.config import Config + +if Config().has_key('Common::ThreadCount'): + defaultThreadCount = int(Config()['Common::ThreadCount']) +else: + defaultThreadCount = 1 class ThreadPool: @@ -22,10 +29,13 @@ class ThreadPool: The argument numThreads defaults to 'Common::ThreadCount' which must be specified in dak.conf.""" - def __init__(self, numThreads = Config()['Common::ThreadCount']): + def __init__(self, numThreads = 0): """Initialize the thread pool with numThreads workers.""" + if numThreads == 0: + numThreads = defaultThreadCount + self.__threads = [] self.__resizeLock = threading.Condition(threading.Lock()) self.__taskLock = threading.Condition(threading.Lock()) @@ -123,14 +133,15 @@ class ThreadPool: # Tell all the threads to quit self.__resizeLock.acquire() try: - self.__setThreadCountNolock(0) - self.__isJoining = True - # Wait until all threads have exited if waitForThreads: + for t in self.__threads: + t.goAway() for t in self.__threads: t.join() del t + self.__setThreadCountNolock(0) + self.__isJoining = True # Reset the pool for potential reuse self.__isJoining = False