Guest User

Untitled

a guest
Feb 18th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. # > time python async_pymongo.py
  2. #
  3. # real 0m0.511s
  4. # user 0m0.220s
  5. # sys 0m0.170s
  6.  
  7. import pymongo
  8. import eventlet
  9. eventlet.monkey_patch()
  10.  
  11. POOL_SIZE = 10
  12.  
  13. class SocketWrapper(object):
  14. __slots__ = ('__pool','__sock')
  15. def __init__(self,pool,sock):
  16. self.__pool = pool
  17. self.__sock = sock
  18. def __getattr__(self,name):
  19. return getattr(self.__sock,name)
  20. def __del__(self):
  21. self.__pool.sockets.put(self.__sock)
  22. del self.__pool
  23. del self.__sock
  24.  
  25. class Pool(object):
  26. def __init__(self,socket_factory,max_pool_size=POOL_SIZE):
  27. self.socket_factory = socket_factory
  28. self.max_pool_size = min(max_pool_size,POOL_SIZE)
  29. self.sockets = None
  30. def socket(self):
  31. if not self.sockets:
  32. self.initialize()
  33. return SocketWrapper(self,self.sockets.get())
  34. def initialize(self):
  35. self.sockets = Queue(self.max_pool_size)
  36. for i in range(self.max_pool_size):
  37. sock = self.socket_factory()
  38. self.sockets.put(sock)
  39. def return_socket(self):
  40. pass
  41.  
  42. pymongo.connection._Pool = Pool
  43.  
  44. db = pymongo.Connection().test
  45.  
  46. def do(*args, **kwargs):
  47. db.test2.insert(*args)
  48.  
  49. pool = eventlet.GreenPool(size=1000)
  50. pile = eventlet.GreenPile(pool)
  51. [pool.spawn_n(do, {'num': i}) for i in xrange(1000)]
  52. pool.waitall()
Add Comment
Please, Sign In to add comment