def test_write_flush(self): """ py.test test/test_framed_buffer.py::FramedBufferTest::test_write_flush -s """ buf = TMemoryBuffer() transport = TCyFramedTransport(buf) transport.write("abcdef") transport.flush() print "Framed Output: ", ["%03d" % ord(i) for i in buf.getvalue()] # MemoryBuffer作为FrameBuffer来使用 buf2 = TCyMemoryBuffer() buf2.prepare_4_frame() buf2.write("abcdef") buf1 = TMemoryBuffer() tran1 = TCyFramedTransportEx(buf1) tran1.flush_frame_buff(buf2) print "Framed Output: ", ["%03d" % ord(i) for i in buf1.getvalue()] buf1.reset() tran1 = TCyFramedTransportEx(buf1) mem_trans = tran1.read_frame() print "ReadFrame: ", mem_trans value = mem_trans.getvalue() print "Value: ", value, ["%03d" % ord(i) for i in value]
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))