from Queue import Queue,Empty,Full
from threading import Lock
class SafeThreadPool(object):
def __init__(self, createFun, initSize=1, maxSize=1):
self.__queue = Queue()
self.__locker = Lock()
for i in xrange(initSize):
self.__queue.put_nowait(createFun())
self.__count = initSize
self.__maxSize = maxSize
self.__createFun = createFun
def getObject(self):
try:
return self.__queue.get_nowait()
except Empty:
self.__tryNewOb()
try:
return self.__queue.get_nowait()
except Empty:
return None
def release(self, obj):
try:
if obj is None:
return
self.__queue.put_nowait(obj)
except Full:
return
def __tryNewOb(self):
self.__locker.acquire()
if self.__count < self.__maxSize:
try:
self.__queue.put_nowait(self.__createFun())
self.__count =+ 1
except Full:
pass
self.__locker.release()