does python have a generic object pool like commons-pool in Java

Diez B. Roggisch deets at nospam.web.de
Wed Jul 15 15:43:06 CEST 2009


Diez B. Roggisch wrote:

> Rick Lawson wrote:
> 
>> On Jul 15, 4:53 am, Jonathan Gardner <jgard... at jonathangardner.net>
>> wrote:
>>> On Jul 14, 6:34 pm, Rick Lawson <lawso... at gmail.com> wrote:
>>>
>>> > Appreciate any help on this. I am porting an app from Java to python
>>> > and need generic object pooling with hooks for object initialization /
>>> > cleanup and be able to specify an object timeout.
>>>
>>> Are you looking for something like a thread pool or a connection pool?
>>> Such a thing is easy to code in Python. Might as well write one from
>>> scratch for your particular need.
>>>
>>> By the way, a tip for writing Python: Forget Java. If you're porting
>>> an app, consider rewriting it from the architecture on up. You'll save
>>> yourself time and get a better result.
>> 
>> Jonathan,
>> 
>> Thanks for the advice but would like to pick your brain a little more.
>> The pool I need is not a thread pool or db pool. I need to pool
>> objects which are a proxy for an external C process that communicates
>> via sockets. The pool is necessary because the initial connection/
>> authentication is expensive, plus the connection needs to be recycled
>> every so often due to instability on the C side. The existing Java
>> code uses commons-pool which incidentally is the base object pool for
>> a db connection pooling library (DBCP). Anyway, maybe this is just so
>> easy to do in Python that everyone rolls their own - but I have done a
>> lot of googling with no luck.
>> 
>> I just hate to re-invent the wheel here - I guess I should look at a
>> db connection pooling library and see if they have a generic object
>> pool somewhere in there. Any you can recommend that are more or less
>> standalone db connection pool libraries ?
> 
> I don't know enough about your domain, e.g. if your pooled objects have
> state or not.
> 
> Assuming that
> 
>  - they are objects
>  - they don't have state (like database connections)
>  - you want to recycle them after so many calls
> 
> one of the simplest solutions would be something like this:
> 
> class AutoDestructingWrapper(object):
> 
>    MAX_CALL_COUNT = 1000
> 
>    def __init__(self, object_factory):
>        self._object_factory = object_factory
>        self._call_count = self.MAX_CALL_COUNT
> 
> 


This must be 

   def __getattr__(self, name):
       self._call_count += 1
       if self._call_count >= self.MAX_CALL_COUNT:
          self._delegate = self._object_factory()
          self._call_count = 0
       return getattr(self._delegate, name)

of course.

Diez



More information about the Python-list mailing list