服务端socket开发之多线程和gevent框架并发测试[python语言]

简介:

测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,

有点属于自娱自乐,要是有问题之处,请大家喷之 !


每个连接都特意堵塞了0.5秒钟 !

012011164.jpg


在大批量tcp测试下,threading的开销越来越大,所以造成了在并发数加大的情况下,出现threading崩溃的情况 !  gevent是 libevent和协程的融合,一个线程里面都可以跑超多的协程! 利用libevent做io堵塞的调度 ,gevent体系下,同一时间只有一个任务在运行 !    



先来测试下多线程:   我们就不加线程池了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf- 8  -*-
#xiaorui.cc
import  sys
import  socket
import  time
import  threading
#xiaorui.cc
def threads(port):
     s = socket.socket()
     s.bind(( '0.0.0.0' , port))
     s.listen( 500 )
     while  True:
         cli, addr = s.accept()
         t = threading.Thread(target=handle_request, args=(cli, time.sleep))
         t.daemon = True
         t.start()
def handle_request(s, sleep):
     try :
         s.recv( 1024 )
         sleep( 0.5 )                                                                                                           
         s.send( '' 'http/ 1.0  200  OK
                   Hello World!  '' ')
         s.shutdown(socket.SHUT_WR)
         print  '.' ,
     except Exception, ex:
         print ex
     finally :
         sys.stdout.flush()
         s.close()
if  __name__ ==  '__main__' :
     threads( 4444 )


用threading跑socket,每个连接堵塞的时间是0.5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
time ab -n  10000  -c  500  http: //127.0.0.1:4444/
This  is  ApacheBench, Version  2.3  <$Revision:  655654  $>
Copyright  1996  Adam Twiss, Zeus Technology Ltd, http: //www.zeustech.net/
Licensed to The Apache Software Foundation, http: //www.apache.org/
Benchmarking  127.0 . 0.1  (be patient)
Completed  1000  requests
Completed  2000  requests
Completed  3000  requests
Completed  4000  requests
Completed  5000  requests
Completed  6000  requests
Completed  7000  requests
Completed  8000  requests
Completed  9000  requests
Completed  10000  requests
Finished  10000  requests
Server Software:
Server Hostname:         127.0 . 0.1
Server Port:             4444
Document Path:          /
Document Length:         0  bytes
Concurrency Level:       500
Time taken  for  tests:    11.123  seconds
Complete requests:       10000
Failed requests:         0
Write errors:            0
Total transferred:       470000  bytes
HTML transferred:        0  bytes
Requests per second:     899.01  [#/sec] (mean)
Time per request:        556.166  [ms] (mean)
Time per request:        1.112  [ms] (mean, across all concurrent requests)
Transfer rate:           41.26  [Kbytes/sec] received
Connection Times (ms)
               min  mean[+/-sd] median   max
Connect:         0    33  177.0       0     1000
Processing:    500   508   33.9     501     1132
Waiting:       500   508   33.9     501     1132
Total:         500   541  201.8     501     2132
Percentage of the requests served within a certain time (ms)
   50 %     501
   66 %     501
   75 %     502
   80 %     505
   90 %     522
   95 %     532
   98 %    1534
   99 %    1722
  100 %    2132  (longest request)
real    0m11.145s
user    0m0.210s
sys     0m0.961s



012312118.jpg

加到800的时候~

012606797.jpg


gevent:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#xiaorui.cc
import  sys
import  socket
import  time
import  gevent
from gevent  import  socket
def server(port):
     s = socket.socket()
     s.bind(( '0.0.0.0' , port))
     s.listen( 500 )
     while  True:
         cli, addr = s.accept()
         gevent.spawn(handle_request, cli, gevent.sleep)
def handle_request(s, sleep):
     try :
         data=s.recv( 1024 )
         sleep( 0.5 )
         s.send( '' 'http/ 1.0  200  OK
                   Hello World!  this  is  xiaorui.cc !!! '' ')
         print data
         request_string =  "GET %s HTTP/1.1\r\nHost: %s\r\n\r\nServer: xiaorui.cc\n"  %( 'index.html' '127.0.0.1' )             
         s.send(request_string)
         s.shutdown(socket.SHUT_WR)
         print  '.' ,‘be killed’
     except Exception, ex:
         print ex
     finally :
                                                                                                                                                                                                                                                                                                                                                                                   
         s.close()
if  __name__ ==  '__main__' :
     server( 7777 )



gevent跑socket服务:

并发数值是500的时候!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
time ab -n  10000  -c  500  http: //127.0.0.1:7777/
This  is  ApacheBench, Version  2.3  <$Revision:  655654  $>
Copyright  1996  Adam Twiss, Zeus Technology Ltd, http: //www.zeustech.net/
Licensed to The Apache Software Foundation, http: //www.apache.org/
Benchmarking  127.0 . 0.1  (be patient)
Completed  1000  requests
Completed  2000  requests
Completed  3000  requests
Completed  4000  requests
Completed  5000  requests
Completed  6000  requests
Completed  7000  requests
Completed  8000  requests
Completed  9000  requests
Completed  10000  requests
Finished  10000  requests
Server Software:
Server Hostname:         127.0 . 0.1
Server Port:             7777
Document Path:          /
Document Length:         0  bytes
Concurrency Level:       500
Time taken  for  tests:    11.312  seconds
Complete requests:       10000
Failed requests:         0
Write errors:            0
Total transferred:       20000  bytes
HTML transferred:        0  bytes
Requests per second:     884.04  [#/sec] (mean)
Time per request:        565.584  [ms] (mean)
Time per request:        1.131  [ms] (mean, across all concurrent requests)
Transfer rate:           1.73  [Kbytes/sec] received
Connection Times (ms)
               min  mean[+/-sd] median   max
Connect:         0    44  202.7       0     1001
Processing:    500   513   10.1     511      707
Waiting:       500   513   10.1     511      707
Total:         500   557  204.1     512     1525
Percentage of the requests served within a certain time (ms)
   50 %     512
   66 %     515
   75 %     517
   80 %     519
   90 %     531
   95 %     552
   98 %    1521
   99 %    1523
  100 %    1525  (longest request)
real    0m11.334s
user    0m0.159s
sys     0m0.730s

010236465.jpg

服务端看到的信息都是正常的!


010104472.jpg


并发是1000的时候:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
time ab -n  10000  -c  1000  http: //127.0.0.1:7777/
This  is  ApacheBench, Version  2.3  <$Revision:  655654  $>
Copyright  1996  Adam Twiss, Zeus Technology Ltd, http: //www.zeustech.net/
Licensed to The Apache Software Foundation, http: //www.apache.org/
Benchmarking  127.0 . 0.1  (be patient)
Completed  1000  requests
Completed  2000  requests
Completed  3000  requests
Completed  4000  requests
Completed  5000  requests
Completed  6000  requests
Completed  7000  requests
Completed  8000  requests
Completed  9000  requests
Completed  10000  requests
Finished  10000  requests
Server Software:
Server Hostname:         127.0 . 0.1
Server Port:             7777
Document Path:          /
Document Length:         0  bytes
Concurrency Level:       1000
Time taken  for  tests:    7.406  seconds
Complete requests:       10000
Failed requests:         0
Write errors:            0
Total transferred:       20000  bytes
HTML transferred:        0  bytes
Requests per second:     1350.22  [#/sec] (mean)
Time per request:        740.623  [ms] (mean)
Time per request:        0.741  [ms] (mean, across all concurrent requests)
Transfer rate:           2.64  [Kbytes/sec] received
Connection Times (ms)
               min  mean[+/-sd] median   max
Connect:         0   175  491.7       0     3000
Processing:    500   520   17.7     515      707
Waiting:       500   520   17.7     515      707
Total:         500   695  492.5     517     3521
Percentage of the requests served within a certain time (ms)
   50 %     517
   66 %     523
   75 %     538
   80 %     569
   90 %    1515
   95 %    1530
   98 %    1539
   99 %    3514
  100 %    3521  (longest request)
real    0m7.428s
user    0m0.208s
sys     0m0.741s


当并发到1500的时候:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
time ab -n  10000  -c  1500  http: //127.0.0.1:7777/
This  is  ApacheBench, Version  2.3  <$Revision:  655654  $>
Copyright  1996  Adam Twiss, Zeus Technology Ltd, http: //www.zeustech.net/
Licensed to The Apache Software Foundation, http: //www.apache.org/
Benchmarking  127.0 . 0.1  (be patient)
Completed  1000  requests
Completed  2000  requests
Completed  3000  requests
Completed  4000  requests
Completed  5000  requests
Completed  6000  requests
Completed  7000  requests
Completed  8000  requests
Completed  9000  requests
Completed  10000  requests
Finished  10000  requests
Server Software:
Server Hostname:         127.0 . 0.1
Server Port:             7777
Document Path:          /
Document Length:         0  bytes
Concurrency Level:       1500
Time taken  for  tests:    5.290  seconds
Complete requests:       10000
Failed requests:         0
Write errors:            0
Total transferred:       20000  bytes
HTML transferred:        0  bytes
Requests per second:     1890.27  [#/sec] (mean)
Time per request:        793.536  [ms] (mean)
Time per request:        0.529  [ms] (mean, across all concurrent requests)
Transfer rate:           3.69  [Kbytes/sec] received
Connection Times (ms)
               min  mean[+/-sd] median   max
Connect:         0   214  404.9       1     1003
Processing:    500   522   23.0     514      716
Waiting:       500   522   23.0     514      716
Total:         500   736  406.7     520     1712
Percentage of the requests served within a certain time (ms)
   50 %     520
   66 %     558
   75 %     602
   80 %    1506
   90 %    1526
   95 %    1531
   98 %    1535
   99 %    1548
  100 %    1712  (longest request)
real    0m5.313s
user    0m0.275s
sys     0m0.763s



出现了少量的报错:

010710202.jpg


gevent 可以加个队列,来限制协程的数目,但是数目限制了,虽然稳定了,但是并发数上不去。

1
2
from gevent.pool  import  Pool
pool = Pool(N)




这里测试有点简单,虽然已经安排了连接的堵塞,但是毕竟不符合业务。 有时间把后端的任务改成才mongodb取数据 !






 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1342536,如需转载请自行联系原作者



相关文章
|
4天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
73 44
|
5天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
31 7
|
7天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
26 8
|
3天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
性能优化与代码审查:提升Python开发效率
8 1
|
6天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
23 4
|
5天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
22 2
|
6天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
10 3
|
8天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
13 1
|
27天前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
38 1
C++ 多线程之初识多线程
|
11天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
12 3