Package pypat :: Package creational :: Module pool
[hide private]
[frames] | no frames]

Source Code for Module pypat.creational.pool

 1  from abc import ABCMeta 
 2  from copy import deepcopy 
 3  from pypat.behavioral.memento import Originator 
 4   
 5   
6 -class Reusable(Originator, metaclass=ABCMeta):
7 """ 8 An abstract reusable class. 9 10 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Creational-Pattern-Usage} 11 - External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern} 12 """
13 - def __init__(self):
14 """ 15 Initialize a new Reusable instance. 16 """ 17 self.memento = self.commit()
18
19 - def reset(self):
20 """ 21 Reset this objects state to the state that it was created with. 22 """ 23 memento = self.memento 24 self.rollback(deepcopy(memento)) 25 self.memento = memento
26 27
28 -class Pool(object):
29 """ 30 An Object Pool design pattern implementation. 31 32 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Creational-Pattern-Usage} 33 - External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern} 34 """
35 - def __init__(self, reusable_class, *args, **kwargs):
36 """ 37 Initialize a new object pool instance. 38 39 @param reusable_class: The reusable class this object pool is responsible for. 40 @param args: args for reusable object creation. 41 @param kwargs: kwargs for reusable object creation. 42 """ 43 self.reusables = list() 44 self.reusable_class = reusable_class 45 self.args = args 46 self.kwargs = kwargs 47 self.pool_size = 2 48 self._expand(self.pool_size)
49
50 - def acquire(self):
51 """ 52 Acquire an object from the pool. 53 54 @return: An object from the pool. 55 """ 56 try: 57 reusable = self.reusables.pop() 58 except IndexError: 59 self._expand(self.pool_size) 60 reusable = self.reusables.pop() 61 62 return reusable
63
64 - def release(self, reusable):
65 """ 66 Release an object back into the pool. 67 68 @param reusable: The object to return to the pool. 69 """ 70 reusable.reset() 71 self.reusables.append(reusable)
72
73 - def _expand(self, size):
74 for i in range(0, size): 75 self.reusables.append(self.reusable_class(*self.args, **self.kwargs))
76