self.global_max.acquire() #semaphore try: self.lock.acquire() local = self.ids[identifier] self.lock.release() if not local.max.acquire(false): # acquire local lock, releasing global lock when waiting self.global_max.release() local.max.acquire() self.global_max.acquire() try: # we have permission to use a connection # check if a connection exists local.lock.acquire() try: if len(local.conns > 0): connection = local.conns.pop() else: # find out if we need to close a connection self.lock.acquire() try: if total.conns >= max_conns: #we need to close a connection #find oldest connection, close it finally: self.lock.release() #create new connection finally: local.lock.release() except: local.max.release() raise except: self.global_max.release() raise