pool.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """http://stackoverflow.com/questions/1514120/python-implementation-of-the-object-pool-design-pattern"""
  4. class QueueObject():
  5. def __init__(self, queue, auto_get=False):
  6. self._queue = queue
  7. self.object = self._queue.get() if auto_get else None
  8. def __enter__(self):
  9. if self.object is None:
  10. self.object = self._queue.get()
  11. return self.object
  12. def __exit__(self, Type, value, traceback):
  13. if self.object is not None:
  14. self._queue.put(self.object)
  15. self.object = None
  16. def __del__(self):
  17. if self.object is not None:
  18. self._queue.put(self.object)
  19. self.object = None
  20. def main():
  21. try:
  22. import queue
  23. except ImportError: # python 2.x compatibility
  24. import Queue as queue
  25. def test_object(queue):
  26. queue_object = QueueObject(queue, True)
  27. print('Inside func: {}'.format(queue_object.object))
  28. sample_queue = queue.Queue()
  29. sample_queue.put('yam')
  30. with QueueObject(sample_queue) as obj:
  31. print('Inside with: {}'.format(obj))
  32. print('Outside with: {}'.format(sample_queue.get()))
  33. sample_queue.put('sam')
  34. test_object(sample_queue)
  35. print('Outside func: {}'.format(sample_queue.get()))
  36. if not sample_queue.empty():
  37. print(sample_queue.get())
  38. if __name__ == '__main__':
  39. main()
  40. ### OUTPUT ###
  41. # Inside with: yam
  42. # Outside with: yam
  43. # Inside func: sam
  44. # Outside func: sam