Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # > time python async_pymongo.py
- #
- # real 0m0.511s
- # user 0m0.220s
- # sys 0m0.170s
- import pymongo
- import eventlet
- eventlet.monkey_patch()
- POOL_SIZE = 10
- class SocketWrapper(object):
- __slots__ = ('__pool','__sock')
- def __init__(self,pool,sock):
- self.__pool = pool
- self.__sock = sock
- def __getattr__(self,name):
- return getattr(self.__sock,name)
- def __del__(self):
- self.__pool.sockets.put(self.__sock)
- del self.__pool
- del self.__sock
- class Pool(object):
- def __init__(self,socket_factory,max_pool_size=POOL_SIZE):
- self.socket_factory = socket_factory
- self.max_pool_size = min(max_pool_size,POOL_SIZE)
- self.sockets = None
- def socket(self):
- if not self.sockets:
- self.initialize()
- return SocketWrapper(self,self.sockets.get())
- def initialize(self):
- self.sockets = Queue(self.max_pool_size)
- for i in range(self.max_pool_size):
- sock = self.socket_factory()
- self.sockets.put(sock)
- def return_socket(self):
- pass
- pymongo.connection._Pool = Pool
- db = pymongo.Connection().test
- def do(*args, **kwargs):
- db.test2.insert(*args)
- pool = eventlet.GreenPool(size=1000)
- pile = eventlet.GreenPile(pool)
- [pool.spawn_n(do, {'num': i}) for i in xrange(1000)]
- pool.waitall()
Add Comment
Please, Sign In to add comment