Allow the pool lock to be specialized

It can be quite useful to allow the lock that the pool
uses to be specified to be something other than the default
threading lock class/type. This can be especially useful when
eventlet (or gevent or other) are used which have there own
special lock type that connects into there event-loop.
This commit is contained in:
Joshua Harlow
2015-04-16 10:20:14 -07:00
parent b7ba927d97
commit 39e7fef87b
2 changed files with 12 additions and 4 deletions

View File

@@ -836,7 +836,10 @@ class PooledClient(object):
ignore_exc=False,
socket_module=socket,
key_prefix=b'',
max_pool_size=None):
max_pool_size=None,
# Allow this to be a different style of lock (eventlet
# lock/semaphore for example, that works with greenthreads).
lock_generator=None):
self.server = server
self.serializer = serializer
self.deserializer = deserializer
@@ -853,7 +856,8 @@ class PooledClient(object):
self.client_pool = pool.ObjectPool(
self._create_client,
after_remove=lambda client: client.close(),
max_size=max_pool_size)
max_size=max_pool_size,
lock_generator=lock_generator)
def check_key(self, key):
"""Checks key and add key_prefix."""

View File

@@ -24,11 +24,15 @@ class ObjectPool(object):
"""A pool of objects that release/creates/destroys as needed."""
def __init__(self, obj_creator,
after_remove=None, max_size=None):
after_remove=None, max_size=None,
lock_generator=None):
self._used_objs = collections.deque()
self._free_objs = collections.deque()
self._obj_creator = obj_creator
self._lock = threading.Lock()
if lock_generator is None:
self._lock = threading.Lock()
else:
self._lock = lock_generator()
self._after_remove = after_remove
max_size = max_size or 2 ** 31
if not isinstance(max_size, six.integer_types) or max_size < 0: