Beispiel #1
0
    def _test_write_and_read(self, obj):
        buff0 = TCyMemoryBuffer()
        op0 = TCyBinaryProtocol(buff0)
        op0.write_struct(obj)
        value0 = buff0.getvalue()

        buff1 = TCyMemoryBuffer(value0)
        op1 = TCyBinaryProtocol(buff1)
        obj1 = obj.__class__()

        return op1.read_struct(obj1)
    def _test_write_and_read(self, obj):
        buff0 = TCyMemoryBuffer()
        op0 = TCyBinaryProtocol(buff0)
        op0.write_struct(obj)
        value0 = buff0.getvalue()

        buff1 = TCyMemoryBuffer(value0)
        op1 = TCyBinaryProtocol(buff1)
        obj1 = obj.__class__()

        return op1.read_struct(obj1)
    def _test_protocol_write(self, obj):
        # cython版本
        buff0 = TCyMemoryBuffer()
        op0 = TCyBinaryProtocol(buff0)
        op0.write_struct(obj)
        value0 = buff0.getvalue()

        # Python版本
        buff1 = TMemoryBuffer()
        op1 = TUtf8BinaryProtocol(buff1)
        obj.write(op1)
        value1 = buff1.get_raw_value()

        self.assertEqual(value1, value0, "write result not the same")
Beispiel #4
0
    def _test_protocol_write(self, obj):
        # cython版本
        buff0 = TCyMemoryBuffer()
        op0 = TCyBinaryProtocol(buff0)
        op0.write_struct(obj)
        value0 = buff0.getvalue()

        # Python版本
        buff1 = TMemoryBuffer()
        op1 = TUtf8BinaryProtocol(buff1)
        obj.write(op1)
        value1 = buff1.get_raw_value()

        self.assertEqual(value1, value0, "write result not the same")
Beispiel #5
0
    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 new_rpc_exit_message():
    buf = TCyMemoryBuffer()
    protocol = TCyBinaryProtocol(buf)

    protocol.writeMessageBegin("worker_shutdonw", MESSAGE_TYPE_STOP, 0)
    protocol.writeMessageEnd()
    return buf
    def test_read_write_exception(self):
        """
            测试可行性
            py.test test/test_protocol.py::SimpleTest::test_read_write_exception -s
        """
        ex = RpcException(1, "Hello")

        self._test_protocol_write(ex)

        total_time = 1
        t = time.time()
        for i in range(total_time):
            buff0 = TCyMemoryBuffer()
            op0 = TCyBinaryProtocol(buff0)
            op0.write_struct(ex)
            value0 = buff0.getvalue()
        t = time.time() - t
        print "T: %.3fms" % (t * 1000)
        print "Value0:", ["%03d" % ord(i) for i in value0]

        buff0 = TCyMemoryBuffer(value0)
        op0 = TCyBinaryProtocol(buff0)
        ex0 = op0.read_struct(RpcException())
        print "Code: ", ex0.code
        print "Msg: ", ex0.msg







        t = time.time()
        for i in range(total_time):
            buff1 = TMemoryBuffer()
            op1 = TBinaryProtocol(buff1)
            ex.write(op1)
            value1 = buff1.get_raw_value()
        t = time.time() - t
        print "T: %.3fms" % (t * 1000)
        print "Value1:", ["%03d" % ord(i) for i in value1]

        self.assertEqual(value1, value0, "write struct test failed")
Beispiel #8
0
    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]
Beispiel #9
0
    def test_read_write_exception(self):
        """
            测试可行性
            py.test test/test_protocol.py::SimpleTest::test_read_write_exception -s
        """
        ex = RpcException(1, "Hello")

        self._test_protocol_write(ex)

        total_time = 1
        t = time.time()
        for i in range(total_time):
            buff0 = TCyMemoryBuffer()
            op0 = TCyBinaryProtocol(buff0)
            op0.write_struct(ex)
            value0 = buff0.getvalue()
        t = time.time() - t
        print "T: %.3fms" % (t * 1000)
        print "Value0:", ["%03d" % ord(i) for i in value0]

        buff0 = TCyMemoryBuffer(value0)
        op0 = TCyBinaryProtocol(buff0)
        ex0 = op0.read_struct(RpcException())
        print "Code: ", ex0.code
        print "Msg: ", ex0.msg

        t = time.time()
        for i in range(total_time):
            buff1 = TMemoryBuffer()
            op1 = TBinaryProtocol(buff1)
            ex.write(op1)
            value1 = buff1.get_raw_value()
        t = time.time() - t
        print "T: %.3fms" % (t * 1000)
        print "Value1:", ["%03d" % ord(i) for i in value1]

        self.assertEqual(value1, value0, "write struct test failed")
Beispiel #10
0
    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))