diff --git a/dubbo/client.py b/dubbo/client.py
index 6c149f4..f1bbbcc 100644
--- a/dubbo/client.py
+++ b/dubbo/client.py
@@ -152,7 +152,7 @@
             hosts_weight.append(int(weights.get(host, '100')))
 
         hit = randint(0, sum(hosts_weight) - 1)
-        for i in range(len(hosts)):
+        for i in xrange(len(hosts)):
             if hit <= sum(hosts_weight[:i + 1]):
                 return hosts[i]
 
diff --git a/dubbo/codec/decoder.py b/dubbo/codec/decoder.py
index 0e133dc..2399ab7 100644
--- a/dubbo/codec/decoder.py
+++ b/dubbo/codec/decoder.py
@@ -164,7 +164,7 @@
         :return:
         """
         value = u''
-        for i in range(length):
+        for i in xrange(length):
             ch = self.read_byte()
             if ch < 0x80:
                 value += unichr(ch)
@@ -232,7 +232,7 @@
 
         field_length = self.read_int()
         field_names = []
-        for i in range(field_length):
+        for i in xrange(field_length):
             field_names.append(self.read_string())
         self.field_names.append(field_names)
         return self.read_object()
@@ -264,23 +264,23 @@
         if 0x70 <= value <= 0x77:
             _type = self.read_type()  # type对于Python来说没有用处
             length = value - 0x70
-            for i in range(length):
+            for i in xrange(length):
                 result.append(self.read_next())
         # 固定长度的无类型短小列表
         elif 0x78 <= value <= 0x7f:
             length = value - 0x78
-            for i in range(length):
+            for i in xrange(length):
                 result.append(self.read_next())
         # 固定长度的有类型列表
         elif value == 0x56:
             _type = self.read_type()
             length = self.read_int()
-            for i in range(length):
+            for i in xrange(length):
                 result.append(self.read_next())
         # 固定长度的无类型列表
         elif value == 0x58:
             length = self.read_int()
-            for i in range(length):
+            for i in xrange(length):
                 result.append(self.read_next())
         # 可变长度的有类型列表
         elif value == 0x55:
@@ -391,7 +391,7 @@
 
         field_length = self.read_int()
         field_names = []
-        for i in range(field_length):
+        for i in xrange(field_length):
             field_names.append(self.read_string())
         self.field_names.append(field_names)
 
diff --git a/dubbo/codec/encoder.py b/dubbo/codec/encoder.py
index c2f0765..4e21c3a 100644
--- a/dubbo/codec/encoder.py
+++ b/dubbo/codec/encoder.py
@@ -161,7 +161,7 @@
         body.append(ord('Z'))
 
         # 因为在上面的逻辑中没有对byte大小进行检测，所以在这里进行统一的处理
-        for i in range(len(body)):
+        for i in xrange(len(body)):
             body[i] = body[i] & 0xff
         return body
 
diff --git a/dubbo/common/util.py b/dubbo/common/util.py
index f53bb1c..2ea4873 100644
--- a/dubbo/common/util.py
+++ b/dubbo/common/util.py
@@ -122,11 +122,4 @@
 
 
 if __name__ == '__main__':
-    def test():
-        while 1:
-            print get_invoke_id()
-
-
-    for i in range(10):
-        thread = threading.Thread(target=test)
-        thread.start()
+    pass
diff --git a/tests/dubbo_test.py b/tests/dubbo_test.py
index ebc94e2..ba63278 100644
--- a/tests/dubbo_test.py
+++ b/tests/dubbo_test.py
@@ -109,13 +109,13 @@
 
     # @unittest.skip('skip performance test')
     def test_multi_threading(self):
-        for i in range(10):
+        for i in xrange(10):
             thread = threading.Thread(target=self._run_num)
             thread.start()
 
     # @unittest.skip('skip performance test')
     def test_performance(self):
-        for i in range(10):
+        for i in xrange(10):
             self.dubbo.call('echo18')
 
     def test_auto_rule(self):
diff --git a/tests/run_test.py b/tests/run_test.py
index 45029c8..df61476 100644
--- a/tests/run_test.py
+++ b/tests/run_test.py
@@ -16,10 +16,10 @@
         self.dubbo = DubboClient('me.hourui.echo.provider.Echo', zk_register=zk)
 
     def test_run(self):
-        for i in range(10):
-            # thread = threading.Thread(target=run, args=(self.dubbo,))
-            # thread.start()
-            self.dubbo.call('echo18')
+        for i in xrange(10):
+            thread = threading.Thread(target=run, args=(self.dubbo,))
+            thread.start()
+            # self.dubbo.call('echo18')
 
 
 def pretty_print(value):
@@ -27,7 +27,7 @@
 
 
 def run(_dubbo):
-    for j in range(10000000):
+    for j in xrange(1000):
         _dubbo.call('echo18', timeout=1)
 
 
