def __init__(self): self._acceptors = {} self._stop_waiter = Waiter(timeout=self.app.shutdown_timeout) super(Acceptors, self).__init__()
def __init__(self): self._acceptors = {} self._stop_waiter = Waiter( timeout=self.app.shutdown_timeout) super(Acceptors, self).__init__()
class Acceptors(StartStopMixin, LoopMixin): """Maintain pool of acceptors. Start them when needed.""" def __init__(self): self._acceptors = {} self._stop_waiter = Waiter(timeout=self.app.shutdown_timeout) super(Acceptors, self).__init__() def __iter__(self): """Iterate over registered acceptors.""" return iter(self._acceptors.values()) @cached_property def Acceptor(self): """Shortcut to :class:`thriftworker.acceptor.Acceptor` class.""" return self.app.Acceptor def register(self, fd, name, backlog=None): """Register new acceptor in pool.""" self._acceptors[name] = self.Acceptor(name, fd, backlog=backlog) def start_by_name(self, name): """Start acceptor by name.""" acceptor = self._acceptors[name] self.app.hub.callback(acceptor.start) def stop_by_name(self, name): """Stop acceptor by name.""" acceptor = self._acceptors[name] self.app.hub.callback(acceptor.stop) def start_accepting(self): """Start all registered acceptors if needed.""" for acceptor in self._acceptors.values(): acceptor.start() def stop_accepting(self, callback=None): """Stop all registered acceptors if needed.""" for acceptor in self._acceptors.values(): acceptor.stop(callback) @property def connections_number(self): """Return current connection number across all acceptors.""" return sum(acceptor.connections_number for acceptor in self) @property def empty(self): """Are all acceptors empty or not.""" return self.connections_number == 0 def stop(self): """Close all registered acceptors.""" # wait for unclosed connections def on_close(): if self.empty: self._stop_waiter.done() # stop accepting new connection self.stop_accepting(callback=on_close) # wait for unclosed connections if not self.empty: logger.info('Waiting for unclosed connections...') self._stop_waiter.wait() if not self.empty: logger.warning('Not all connection closed!') # close existed connection for acceptor in self: acceptor.close()
class Acceptors(StartStopMixin, LoopMixin): """Maintain pool of acceptors. Start them when needed.""" def __init__(self): self._acceptors = {} self._stop_waiter = Waiter( timeout=self.app.shutdown_timeout) super(Acceptors, self).__init__() def __iter__(self): """Iterate over registered acceptors.""" return iter(self._acceptors.values()) @cached_property def Acceptor(self): """Shortcut to :class:`thriftworker.acceptor.Acceptor` class.""" return self.app.Acceptor def register(self, fd, name, backlog=None): """Register new acceptor in pool.""" self._acceptors[name] = self.Acceptor(name, fd, backlog=backlog) def start_by_name(self, name): """Start acceptor by name.""" acceptor = self._acceptors[name] self.app.hub.callback(acceptor.start) def stop_by_name(self, name): """Stop acceptor by name.""" acceptor = self._acceptors[name] self.app.hub.callback(acceptor.stop) def start_accepting(self): """Start all registered acceptors if needed.""" for acceptor in self._acceptors.values(): acceptor.start() def stop_accepting(self, callback=None): """Stop all registered acceptors if needed.""" for acceptor in self._acceptors.values(): acceptor.stop(callback) @property def connections_number(self): """Return current connection number across all acceptors.""" return sum(acceptor.connections_number for acceptor in self) @property def empty(self): """Are all acceptors empty or not.""" return self.connections_number == 0 def stop(self): """Close all registered acceptors.""" # wait for unclosed connections def on_close(): if self.empty: self._stop_waiter.done() # stop accepting new connection self.stop_accepting(callback=on_close) # wait for unclosed connections if not self.empty: logger.info('Waiting for unclosed connections...') self._stop_waiter.wait() if not self.empty: logger.warning('Not all connection closed!') # close existed connection for acceptor in self: acceptor.close()