def connection_to_lb(self): if self.unix_socket: info_logger.info("Prepare open a socket to lb: %s, pid: %s", self.unix_socket, self.pid) else: info_logger.info("Prepare open a socket to lb: %s:%s, pid: %s", self.host, self.port, self.pid) # 1. 创建一个到lb的连接,然后开始读取Frame, 并且返回数据 socket = TSocket(host=self.host, port=self.port, unix_socket=self.unix_socket) try: if not socket.isOpen(): socket.open() socket.setTimeout(5000) # 出现异常,会自己重启 except TTransportException: info_logger.info("Sleep %ds for another retry, pid: %s", self.reconnect_interval, self.pid) time.sleep(self.reconnect_interval) print_exception(info_logger) if self.reconnect_interval < 4: self.reconnect_interval *= 2 return # 2. 连接创建成功 self.reconnect_interval = 1 self.socket = socket # 每次建立连接都重新构建 self.queue = gevent.queue.Queue() self.connection_ok = True info_logger.info("Begin request loop....") # 3. 在同一个transport上进行读写数据 transport = TCyFramedTransportEx(socket) # # 关注 transport的接口: # flush_frame_buff # read_frame # g1 = gevent.spawn(self.loop_reader, transport, self.queue) g2 = gevent.spawn(self.loop_writer, transport, self.queue) g3 = gevent.spawn(self.loop_hb_detect, transport) gevent.joinall([g1, g2, g3]) # 4. 关闭连接 try: # 什么情况下会关闭呢? 连接断开了, print time.strftime(ISOTIMEFORMAT, time.localtime()), "Trans Closed, queue size: ", self.queue.qsize(), ", pid: ", self.pid self.queue = None self.socket = None transport.close() # 关闭transport(而且transport也不会继续复用) except: print_exception(info_logger) pass
def test_isOpen_checks_for_readability(self): # https://docs.python.org/3/library/socket.html#notes-on-socket-timeouts # https://docs.python.org/3/library/socket.html#socket.socket.settimeout timeouts = [ None, # blocking mode 0, # non-blocking mode 1.0, # timeout mode ] for timeout in timeouts: acc = ServerAcceptor(TServerSocket(port=0)) acc.start() sock = TSocket(host="localhost", port=acc.port) self.assertFalse(sock.isOpen()) sock.open() sock.setTimeout(timeout) # the socket shows as open immediately after connecting self.assertTrue(sock.isOpen()) # and remains open during usage sock.write(b"hello") self.assertTrue(sock.isOpen()) while True: try: sock.read(5) except TTransportException as exc: if exc.inner.errno == errno.EAGAIN: # try again when we're in non-blocking mode continue raise break self.assertTrue(sock.isOpen()) # once the server side closes, it no longer shows open acc.client.close( ) # this also blocks until the other thread is done acc.close() self.assertFalse(sock.isOpen()) sock.close()
def connection_to_lb(self): if self.unix_socket: info_logger.info("Prepare open a socket to lb: %s, pid: %s", self.unix_socket, self.pid) else: info_logger.info("Prepare open a socket to lb: %s:%s, pid: %s", self.host, self.port, self.pid) # 1. 创建一个到lb的连接,然后开始读取Frame, 并且返回数据 socket = TSocket(host=self.host, port=self.port, unix_socket=self.unix_socket) try: if not socket.isOpen(): socket.open() socket.setTimeout(5000) # 出现异常,会自己重启 except TTransportException: info_logger.info("Sleep %ds for another retry, pid: %s", self.reconnect_interval, self.pid) time.sleep(self.reconnect_interval) print_exception(info_logger) if self.reconnect_interval < 4: self.reconnect_interval *= 2 return # 2. 连接创建成功 self.reconnect_interval = 1 self.socket = socket # 每次建立连接都重新构建 self.queue = gevent.queue.Queue() self.connection_ok = True info_logger.info("Begin request loop....") # 3. 在同一个transport上进行读写数据 transport = TCyFramedTransportEx(socket) # # 关注 transport的接口: # flush_frame_buff # read_frame # g1 = gevent.spawn(self.loop_reader, transport, self.queue) g2 = gevent.spawn(self.loop_writer, transport, self.queue) g3 = gevent.spawn(self.loop_hb_detect, transport) gevent.joinall([g1, g2, g3]) # 4. 关闭连接 try: # 什么情况下会关闭呢? 连接断开了, print time.strftime(ISOTIMEFORMAT, time.localtime( )), "Trans Closed, queue size: ", self.queue.qsize( ), ", pid: ", self.pid self.queue = None self.socket = None transport.close() # 关闭transport(而且transport也不会继续复用) except: print_exception(info_logger) pass