def _client_processor(self): logging.info("Client processor (selector) thread started!") messaging.NotifierSock().init(self.sel) self.server_socket.listen() self.server_socket.setblocking(False) self.sel.register(self.server_socket, selectors.EVENT_READ, data=None) while self.client_processor_thread_running.is_set(): events = self.sel.select(timeout=1) for key, mask in events: client = key.data if client is None: self._connect_client(key.fileobj) elif isinstance(client, messaging.ConnectionManager): try: client.process_events(mask) except Exception as error: logging.error("Exception {} occurred for {}! Resetting connection!".format(error, client.addr)) traceback.print_exc() client.close(True) else: # Notifier client.process_events(mask) logging.info("Client autoconnect thread stopped!")
def stop(self): logging.info("Stopping server") self.client_processor_thread_running.clear() self.broadcast_thread_interrupt.set() self.broadcast_thread_running.clear() self.listener_thread_running.clear() messaging.NotifierSock().notify() self.server_socket.close() self.sel.close() messaging.NotifierSock().close() logging.info("Server stopped")
def start(self): self.load_config() logger.info("Starting client") messaging.NotifierSock().init(self.selector) try: while True: self._reconnect() self._process_connections() except (KeyboardInterrupt, ): logger.critical("Caught interrupt, exiting!") self.selector.close()
def start(self): """ Reloads config and starts infinite loop of connecting to the server and processing said connection. Calling of this method will indefinitely halt execution of any subsequent code. """ self.load_config() logger.info("Starting client") messaging.NotifierSock().init(self.selector) try: while True: self._reconnect() self._process_connections() except (KeyboardInterrupt, ): logger.critical("Caught interrupt, exiting!") self.selector.close()
def _process_connections(self): while True: events = self.selector.select(timeout=1) for key, mask in events: connection = key.data if connection is not None: try: connection.process_events(mask) except Exception as error: logger.error( "Exception {} occurred for {}! Resetting connection!" .format(error, connection.addr)) self.server_connection._close() self.connected = False if isinstance(error, OSError): if error.errno == errno.EINTR: raise KeyboardInterrupt try: mapping_fds = self.selector.get_map().keys( ) # file descriptors notifier_fd = messaging.NotifierSock().get_sock().fileno() except (KeyError, RuntimeError) as e: logger.error( "Exception {} occurred when getting connections map!". format(e)) logger.error( "Connections changed during getting connections map, passing" ) else: notify_only = len( mapping_fds) == 1 and notifier_fd in mapping_fds if notify_only or not mapping_fds: logger.warning("No active connections left!") return