class Pool(Group): def __init__(self, size=None, greenlet_class=None): if size is not None and size < 0: raise ValueError('size must not be negative: %r' % (size, )) Group.__init__(self) self.size = size if greenlet_class is not None: self.greenlet_class = greenlet_class if size is None: self._semaphore = DummySemaphore() else: self._semaphore = Semaphore(size) def wait_available(self): self._semaphore.wait() def full(self): return self.free_count() <= 0 def free_count(self): if self.size is None: return 1 return max(0, self.size - len(self)) def add(self, greenlet): self._semaphore.acquire() try: Group.add(self, greenlet) except: self._semaphore.release() raise def _discard(self, greenlet): Group._discard(self, greenlet) self._semaphore.release()
class Pool(Group): def __init__(self, size=None, greenlet_class=None): if size is not None and size < 0: raise ValueError('size must not be negative: %r' % (size, )) Group.__init__(self) self.size = size if greenlet_class is not None: self.greenlet_class = greenlet_class if size is None: self._semaphore = DummySemaphore() else: self._semaphore = Semaphore(size) def wait_available(self): self._semaphore.wait() def full(self): return self.free_count() <= 0 def free_count(self): if self.size is None: return 1 return max(0, self.size - len(self)) def start(self, greenlet): self._semaphore.acquire() try: self.add(greenlet) except: self._semaphore.release() raise greenlet.start() def spawn(self, *args, **kwargs): self._semaphore.acquire() try: greenlet = self.greenlet_class.spawn(*args, **kwargs) self.add(greenlet) except: self._semaphore.release() raise return greenlet def discard(self, greenlet): Group.discard(self, greenlet) self._semaphore.release()
class Pool(Group): def __init__(self, size=None, greenlet_class=None): if size is not None and size < 1: raise ValueError( 'Invalid size for pool (positive integer or None required): %r' % (size, )) Group.__init__(self) self.size = size if greenlet_class is not None: self.greenlet_class = greenlet_class if size is None: self._semaphore = DummySemaphore() else: self._semaphore = Semaphore(size) def wait_available(self): self._semaphore.wait() def full(self): return self.free_count() <= 0 def free_count(self): if self.size is None: return 1 return max(0, self.size - len(self)) def start(self, greenlet): self._semaphore.acquire() try: self.add(greenlet) except: self._semaphore.release() raise greenlet.start() def spawn(self, *args, **kwargs): self._semaphore.acquire() try: greenlet = self.greenlet_class.spawn(*args, **kwargs) self.add(greenlet) except: self._semaphore.release() raise return greenlet def spawn_link(self, *args, **kwargs): self._semaphore.acquire() try: greenlet = self.greenlet_class.spawn_link(*args, **kwargs) self.add(greenlet) except: self._semaphore.release() raise return greenlet def spawn_link_value(self, *args, **kwargs): self._semaphore.acquire() try: greenlet = self.greenlet_class.spawn_link_value(*args, **kwargs) self.add(greenlet) except: self._semaphore.release() raise return greenlet def spawn_link_exception(self, *args, **kwargs): self._semaphore.acquire() try: greenlet = self.greenlet_class.spawn_link_exception( *args, **kwargs) self.add(greenlet) except: self._semaphore.release() raise return greenlet def discard(self, greenlet): Group.discard(self, greenlet) self._semaphore.release()