Пример #1
0
 def __init__(self):
     self._acceptors = {}
     self._stop_waiter = Waiter(timeout=self.app.shutdown_timeout)
     super(Acceptors, self).__init__()
Пример #2
0
 def __init__(self):
     self._acceptors = {}
     self._stop_waiter = Waiter(
         timeout=self.app.shutdown_timeout)
     super(Acceptors, self).__init__()
Пример #3
0
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()
Пример #4
0
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()