diff --git a/lib/py/test/test_thrift_file/TestServer.thrift b/lib/py/test/test_thrift_file/TestServer.thrift
new file mode 100644
index 0000000..0de8856
--- /dev/null
+++ b/lib/py/test/test_thrift_file/TestServer.thrift
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+ 
+
+service TestServer{
+	string add_and_get_msg(1:string msg)
+}
diff --git a/lib/py/test/thrift_TNonblockingServer.py b/lib/py/test/thrift_TNonblockingServer.py
new file mode 100644
index 0000000..7220879
--- /dev/null
+++ b/lib/py/test/thrift_TNonblockingServer.py
@@ -0,0 +1,101 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import os
+import sys
+import threading
+import unittest
+import time
+
+gen_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "gen-py")
+sys.path.append(gen_path)
+import _import_local_thrift  # noqa
+from TestServer import TestServer
+from thrift.transport import TSocket, TTransport
+from thrift.protocol import TBinaryProtocol
+from thrift.server import TNonblockingServer
+
+
+class Handler:
+
+    def add_and_get_msg(self, msg):
+        return msg
+
+
+class Server:
+
+    def __init__(self):
+        handler = Handler()
+        processor = TestServer.Processor(handler)
+        transport = TSocket.TServerSocket("127.0.0.1", 30030)
+        self.server = TNonblockingServer.TNonblockingServer(processor, transport)
+
+    def start_server(self):
+        print("-------start server ------\n")
+        self.server.serve()
+        print("------stop server -----\n")
+
+    def close_server(self):
+        self.server.stop()
+        self.server.close()
+
+
+class Client:
+
+    def start_client(self):
+        transport = TSocket.TSocket("127.0.0.1", 30030)
+        trans = TTransport.TFramedTransport(transport)
+        protocol = TBinaryProtocol.TBinaryProtocol(trans)
+        client = TestServer.Client(protocol)
+        trans.open()
+        self.msg = client.add_and_get_msg("hello thrift")
+
+    def get_message(self):
+        try:
+            msg = self.msg
+            return msg
+        except AttributeError as e:
+            raise e
+            print("self.msg not exit\n")
+
+
+class TestNonblockingServer(unittest.TestCase):
+
+    def test_normalconnection(self):
+        serve = Server()
+        client = Client()
+
+        serve_thread = threading.Thread(target=serve.start_server)
+        client_thread = threading.Thread(target=client.start_client)
+        serve_thread.start()
+        time.sleep(10)
+        client_thread.start()
+        client_thread.join(0.5)
+        try:
+            msg = client.get_message()
+            self.assertEqual("hello thrift", msg)
+        except AssertionError as e:
+            raise e
+            print("assert failure")
+        finally:
+            serve.close_server()
+
+
+if __name__ == '__main__':
+    unittest.main()
