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

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

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

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

#!/usr/bin/env python# -*- coding: utf-8 -*-#xiaorui.ccimport sysimport socketimport timeimport threading#xiaorui.ccdef 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 = Truet.start()def handle_request(s, sleep):try:s.recv(1024)sleep(0.5)s.send(”’http/1.0 200 OKHello World! ”’)s.shutdown(socket.SHUT_WR)print ‘.’,except Exception, ex:print exfinally:sys.stdout.flush()s.close()if __name__ == ‘__main__’:threads(4444)

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

time ab -n 10000 -c 500 :4444/This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, Licensed to The Apache Software Foundation, Benchmarking 127.0.0.1 (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:127.0.0.1Server Port:4444Document Path:/Document Length:0 bytesConcurrency Level:500Time taken for tests: 11.123 secondsComplete requests:10000Failed requests:0Write errors:0Total transferred:470000 bytesHTML transferred:0 bytesRequests 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] receivedConnection Times (ms)min mean[+/-sd] median maxConnect:0 33 177.00 1000Processing: 500 508 33.9 501 1132Waiting:500 508 33.9 501 1132Total:500 541 201.8 501 2132Percentage 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.145suser 0m0.210ssys0m0.961s

加到800的时候~

gevent:

import sysimport socketimport timeimport geventfrom gevent import socketdef 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 datarequest_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 ‘.’,except Exception, ex:print exfinally:s.close()if __name__ == ‘__main__’:server(7777)

gevent跑socket服务:

并发数值是500的时候!

time ab -n 10000 -c 500 :7777/This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, Licensed to The Apache Software Foundation, Benchmarking 127.0.0.1 (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:127.0.0.1Server Port:7777Document Path:/Document Length:0 bytesConcurrency Level:500Time taken for tests: 11.312 secondsComplete requests:10000Failed requests:0Write errors:0Total transferred:20000 bytesHTML transferred:0 bytesRequests 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] receivedConnection Times (ms)min mean[+/-sd] median maxConnect:0 44 202.70 1001Processing: 500 513 10.1 511707Waiting:500 513 10.1 511707Total:500 557 204.1 512 1525Percentage 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.334suser 0m0.159ssys0m0.730s

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

并发是1000的时候:

只有不快的斧,没有劈不开的柴。

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

相关文章:

你感兴趣的文章:

标签云: