Index: third_party/twisted_8_1/twisted/python/threadpool.py |
diff --git a/third_party/twisted_8_1/twisted/python/threadpool.py b/third_party/twisted_8_1/twisted/python/threadpool.py |
deleted file mode 100644 |
index e7f6f93a93b93d2a73ce32669063f642cc8c0720..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/python/threadpool.py |
+++ /dev/null |
@@ -1,242 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_threadpool -*- |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-twisted.threadpool: a pool of threads to which we dispatch tasks. |
- |
-In most cases you can just use reactor.callInThread and friends |
-instead of creating a thread pool directly. |
-""" |
- |
-# System Imports |
-import Queue |
-import threading |
-import copy |
-import sys |
-import warnings |
- |
- |
-# Twisted Imports |
-from twisted.python import log, runtime, context, threadable |
- |
-WorkerStop = object() |
- |
- |
-class ThreadPool: |
- """ |
- This class (hopefully) generalizes the functionality of a pool of |
- threads to which work can be dispatched. |
- |
- callInThread() and stop() should only be called from |
- a single thread, unless you make a subclass where stop() and |
- _startSomeWorkers() are synchronized. |
- """ |
- min = 5 |
- max = 20 |
- joined = False |
- started = False |
- workers = 0 |
- name = None |
- |
- threadFactory = threading.Thread |
- currentThread = staticmethod(threading.currentThread) |
- |
- def __init__(self, minthreads=5, maxthreads=20, name=None): |
- """ |
- Create a new threadpool. |
- |
- @param minthreads: minimum number of threads in the pool |
- |
- @param maxthreads: maximum number of threads in the pool |
- """ |
- assert minthreads >= 0, 'minimum is negative' |
- assert minthreads <= maxthreads, 'minimum is greater than maximum' |
- self.q = Queue.Queue(0) |
- self.min = minthreads |
- self.max = maxthreads |
- self.name = name |
- if runtime.platform.getType() != "java": |
- self.waiters = [] |
- self.threads = [] |
- self.working = [] |
- else: |
- self.waiters = ThreadSafeList() |
- self.threads = ThreadSafeList() |
- self.working = ThreadSafeList() |
- |
- def start(self): |
- """ |
- Start the threadpool. |
- """ |
- self.joined = False |
- self.started = True |
- # Start some threads. |
- self.adjustPoolsize() |
- |
- def startAWorker(self): |
- self.workers += 1 |
- name = "PoolThread-%s-%s" % (self.name or id(self), self.workers) |
- newThread = self.threadFactory(target=self._worker, name=name) |
- self.threads.append(newThread) |
- newThread.start() |
- |
- def stopAWorker(self): |
- self.q.put(WorkerStop) |
- self.workers -= 1 |
- |
- def __setstate__(self, state): |
- self.__dict__ = state |
- ThreadPool.__init__(self, self.min, self.max) |
- |
- def __getstate__(self): |
- state = {} |
- state['min'] = self.min |
- state['max'] = self.max |
- return state |
- |
- def _startSomeWorkers(self): |
- neededSize = self.q.qsize() + len(self.working) |
- # Create enough, but not too many |
- while self.workers < min(self.max, neededSize): |
- self.startAWorker() |
- |
- def dispatch(self, owner, func, *args, **kw): |
- """ |
- DEPRECATED: use L{callInThread} instead. |
- |
- Dispatch a function to be a run in a thread. |
- """ |
- warnings.warn("dispatch() is deprecated since Twisted 8.0, " |
- "use callInThread() instead", |
- DeprecationWarning, stacklevel=2) |
- self.callInThread(func, *args, **kw) |
- |
- def callInThread(self, func, *args, **kw): |
- if self.joined: |
- return |
- ctx = context.theContextTracker.currentContext().contexts[-1] |
- o = (ctx, func, args, kw) |
- self.q.put(o) |
- if self.started: |
- self._startSomeWorkers() |
- |
- def _runWithCallback(self, callback, errback, func, args, kwargs): |
- try: |
- result = apply(func, args, kwargs) |
- except: |
- errback(sys.exc_info()[1]) |
- else: |
- callback(result) |
- |
- def dispatchWithCallback(self, owner, callback, errback, func, *args, **kw): |
- """ |
- DEPRECATED: use L{twisted.internet.threads.deferToThread} instead. |
- |
- Dispatch a function, returning the result to a callback function. |
- |
- The callback function will be called in the thread - make sure it is |
- thread-safe. |
- """ |
- warnings.warn("dispatchWithCallback() is deprecated since Twisted 8.0, " |
- "use twisted.internet.threads.deferToThread() instead.", |
- DeprecationWarning, stacklevel=2) |
- self.callInThread( |
- self._runWithCallback, callback, errback, func, args, kw |
- ) |
- |
- def _worker(self): |
- """ |
- Method used as target of the created threads: retrieve task to run |
- from the threadpool, run it, and proceed to the next task until |
- threadpool is stopped. |
- """ |
- ct = self.currentThread() |
- o = self.q.get() |
- while o is not WorkerStop: |
- self.working.append(ct) |
- ctx, function, args, kwargs = o |
- try: |
- context.call(ctx, function, *args, **kwargs) |
- except: |
- context.call(ctx, log.err) |
- self.working.remove(ct) |
- del o, ctx, function, args, kwargs |
- self.waiters.append(ct) |
- o = self.q.get() |
- self.waiters.remove(ct) |
- |
- self.threads.remove(ct) |
- |
- def stop(self): |
- """ |
- Shutdown the threads in the threadpool. |
- """ |
- self.joined = True |
- threads = copy.copy(self.threads) |
- while self.workers: |
- self.q.put(WorkerStop) |
- self.workers -= 1 |
- |
- # and let's just make sure |
- # FIXME: threads that have died before calling stop() are not joined. |
- for thread in threads: |
- thread.join() |
- |
- def adjustPoolsize(self, minthreads=None, maxthreads=None): |
- if minthreads is None: |
- minthreads = self.min |
- if maxthreads is None: |
- maxthreads = self.max |
- |
- assert minthreads >= 0, 'minimum is negative' |
- assert minthreads <= maxthreads, 'minimum is greater than maximum' |
- |
- self.min = minthreads |
- self.max = maxthreads |
- if not self.started: |
- return |
- |
- # Kill of some threads if we have too many. |
- while self.workers > self.max: |
- self.stopAWorker() |
- # Start some threads if we have too few. |
- while self.workers < self.min: |
- self.startAWorker() |
- # Start some threads if there is a need. |
- self._startSomeWorkers() |
- |
- def dumpStats(self): |
- log.msg('queue: %s' % self.q.queue) |
- log.msg('waiters: %s' % self.waiters) |
- log.msg('workers: %s' % self.working) |
- log.msg('total: %s' % self.threads) |
- |
- |
-class ThreadSafeList: |
- """ |
- In Jython 2.1 lists aren't thread-safe, so this wraps it. |
- """ |
- |
- def __init__(self): |
- self.lock = threading.Lock() |
- self.l = [] |
- |
- def append(self, i): |
- self.lock.acquire() |
- try: |
- self.l.append(i) |
- finally: |
- self.lock.release() |
- |
- def remove(self, i): |
- self.lock.acquire() |
- try: |
- self.l.remove(i) |
- finally: |
- self.lock.release() |
- |
- def __len__(self): |
- return len(self.l) |
- |