def new_rpc_exit_message(): buf = TCyMemoryBuffer() protocol = TCyBinaryProtocol(buf) protocol.writeMessageBegin("worker_shutdonw", MESSAGE_TYPE_STOP, 0) protocol.writeMessageEnd() return buf
def handle_request(self, proto_input, queue, request_meta): """ 从 proto_input中读取数据,然后调用processor处理请求,结果暂时缓存在内存中, 最后一口气交给 queue, 由专门的 greenlet将数据写回到socket上 request_meta = (name, type, seqid, start_time) """ start_time0 = time.time() # 1. 获取一个可用的trans_output if len(self.out_protocols) > 0: trans_output, proto_output = self.out_protocols.popleft() trans_output.prepare_4_frame() # 预留4个字节的Frame Size else: trans_output = TCyMemoryBuffer() trans_output.prepare_4_frame() proto_output = TCyBinaryProtocol(trans_output, client=False) # 无状态的 try: # 2.1 处理正常的请求 self.processor.process(proto_input, proto_output) queue.put(trans_output) except Exception as e: # 2.2 处理异常(主要是结果序列化时参数类型不对的情况) trans_output.prepare_4_frame() name = request_meta[0] seqId = request_meta[2] msg = '%s, Exception: %s, Trace: %s' % (name, e, traceback.format_exc()) x = TApplicationException(TApplicationException.INVALID_PROTOCOL, msg) proto_output.writeMessageBegin(name, TMessageType.EXCEPTION, seqId) x.write(proto_output) proto_output.writeMessageEnd() proto_output.trans.flush() queue.put(trans_output) finally: start_time = request_meta[3] now = time.time() elapsed = now - start_time if elapsed > 2: # 做异常记录 exception_logger.info( "Exception Request: %s %s seqId: %s_%s, Elaspsed: %.3f, Execute: %.3f", request_meta[0], request_meta[1], self.pid, request_meta[2], elapsed, now - start_time0) # 3. 回收 transport 和 protocol self.out_protocols.append((trans_output, proto_output))
def handle_request(self, proto_input, queue, request_meta): """ 从 proto_input中读取数据,然后调用processor处理请求,结果暂时缓存在内存中, 最后一口气交给 queue, 由专门的 greenlet将数据写回到socket上 request_meta = (name, type, seqid, start_time) """ start_time0 = time.time() # 1. 获取一个可用的trans_output if len(self.out_protocols) > 0: trans_output, proto_output = self.out_protocols.popleft() trans_output.prepare_4_frame() # 预留4个字节的Frame Size else: trans_output = TCyMemoryBuffer() trans_output.prepare_4_frame() proto_output = TCyBinaryProtocol(trans_output, client=False) # 无状态的 try: # 2.1 处理正常的请求 self.processor.process(proto_input, proto_output) queue.put(trans_output) except Exception as e: # 2.2 处理异常(主要是结果序列化时参数类型不对的情况) trans_output.prepare_4_frame() name = request_meta[0] seqId = request_meta[2] msg = '%s, Exception: %s, Trace: %s' % (name, e, traceback.format_exc()) x = TApplicationException(TApplicationException.INVALID_PROTOCOL, msg) proto_output.writeMessageBegin(name, TMessageType.EXCEPTION, seqId) x.write(proto_output) proto_output.writeMessageEnd() proto_output.trans.flush() queue.put(trans_output) finally: start_time = request_meta[3] now = time.time() elapsed = now - start_time if elapsed > 2: # 做异常记录 exception_logger.info("Exception Request: %s %s seqId: %s_%s, Elaspsed: %.3f, Execute: %.3f", request_meta[0], request_meta[1], self.pid, request_meta[2], elapsed, now - start_time0) # 3. 回收 transport 和 protocol self.out_protocols.append((trans_output, proto_output))