初试Gevent – 高性能的Python并发框架
Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。
于greenlet、eventlet相比,性能略低,但是它封装的API非常完善,最赞的是提供了一个monkey类,可以将现有基于Python线程直接转化为greenlet,相当于proxy了一下(打了patch)。
今天有空就迫不及待的试一下效果。
1、安装
Gevent依赖libevent和greenlet,需要分别安装。
Python
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#libevent 1.4.x
sudo apt-get install libevent-dev
#python_dev
sudo apt-get install python-dev
#easy_install
wget -q http://peak.telecommunity.com/dist/ez_setup.py
sudo python ./ez_setup.py
#greenlet
wget http://pypi.python.org/packages/source/g/greenlet/greenlet-0.3.1.tar.gz#md5=8d75d7f3f659e915e286e1b0fa0e1c4d
tar -xzvf greenlet-0.3.1.tar.gz
cd greenlet-0.3.1/
sudo python setup.py install
#gevent
wget http://pypi.python.org/packages/source/g/gevent/gevent-0.13.6.tar.gz#md5=7c836ce2315d44ba0af6134efbcd38c9
tar -xzvf gevent-0.13.6.tar.gz
cd gevent-0.13.6/
sudo python setup.py install
|
至此,安装完毕。
2、测试代码:XML-RPC
这里必须使用支持线程的XML-RPC,否则无法发挥gevent的优势!
传统版本:
需要说明的是,这个并很多资料描述的非单线程,而是一个select版本,所以某些时候比线程版本性能好。
Python
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from SocketServer import ThreadingMixIn
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from SocketServer import TCPServer
TCPServer.request_queue_size = 10000
#Logic function
def add(a, b):
return a + b
#Logic function 2
def gen(n):
return '0' * n
#create server
server = SimpleXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler,False)
server.register_function(add, "add")
server.register_function(gen, "gen")
server.serve_forever()
|
线程版本:3、测试客户端
Python
|
1
2
3
4
5
6
|
from xmlrpclib import ServerProxy
#Execute RPC
server = ServerProxy("http://localhost:8080")
#print server.add(3,5)
print server.gen(2048)
|
monkey是非入侵式的patch,只需要显示调用你需要patch的东西就行了,别看我用了三行,其实可以patch_all()的
Python
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from SocketServer import ThreadingMixIn
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from gevent import monkey
#Threaded XML-RPC && Monkey Patch
monkey.patch_socket() #Just 2 line!
monkey.patch_thread() #Just 3 line!
monkey.patch_select() #Just 3 line!
class TXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass
#Logic function
def add(a, b):
return a + b
#Logic function 2
def gen(n):
return "0" * n
#create server
server = TXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)
server.register_function(add, "add")
server.register_function(gen, "gen")
server.serve_forever()
|
5、测试结果
现在只有一台机器,下午去实验室两台机器跑了以后,放上结果。对gevent还是比较寄希望的,希望不要太差。。
客户端的特殊配置:
echo -e ‘1024t65535’ | sudo tee /proc/sys/net/ipv4/ip_local_port_range
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_syncookies
ulimit -n 10240
服务器端的特殊配置:
echo “10152 65535″ > /proc/sys/net/ipv4/ip_local_port_range
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_tw_recycle
sysctl -w fs.file-max=128000
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.core.somaxconn=250000
sysctl -w net.ipv4.tcp_max_syn_backlog=2500
sysctl -w net.core.netdev_max_backlog=2500
ulimit -n 10240
然后说让大家比较失望的结果:测试效果非常失败,经常出现异常情况,根据我的分析是默认的XML-RPC没有backlog(或者默认太低),导致压力一大,就会fail accept,从而导致RESET(connection refused)。厦门叉车租赁公司
所以说对monkey的patch不要抱太大希望,他是和原代码密切相关的。
补充:已经找到修改默认backlog的方法,如下:
Python
|
1
2
3
|
from SocketServer import TCPServer
#修改这个全局变量即可
TCPServer.request_queue_size = 5000
|
当然测试数据说明,不要过分迷恋monkey,那只是个传说~
测试数据:
c=500 n=50000
默认:2845/s, 8M
多线程:1966/s, 51M
gevent:1888/s, 11M
c=1000 n=100000
默认:3096/s, 8M
多线程:1895/s, 52M
gevent:1936/s, 11M
c=5000 n=500000
默认:3009/s, 8M
多线程:失败,无法创建新线程
gevent:1988/s, 11M
c=10000 n=1000000
默认:2883/s, 8M
多线程:失败,无法创建新线程
gevent:1992/s, 20M
monkey的优点就是:省内存,我是和线程的相比。
我仔细的分析了一下,XML-RPC使用CPU的比例还是很大的,相比较于直接http的计算,xmlrpc还是属于cpu密集型。
在这种CPU占用很高,需要反复争夺微greenlet的情况下,gevent并不具有优势。
或者从另一种角度说,测试机不够强大,喂不饱gevent(可以看到,随着并发线程升高,gevent的性能不降反升,而默认的则在不断下降)
初试Gevent – 高性能的Python并发框架的更多相关文章
- python Gevent – 高性能的Python并发框架
话说gevent也没个logo啥的,于是就摆了这张图= =|||,首先这是一种叫做greenlet的鸟,而在python里,按照官方解释greenlet是轻量级的并行编程,而gevent呢,就是利用g ...
- Python Web框架Tornado的异步处理代码演示样例
1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...
- 协程并发框架gevent及其用法
gevent是python的一个并发框架,采用协程实现并发目的,用起来也非常简单 gevent的docs:http://www.gevent.org/contents.html 一个最简单的例子: i ...
- Python 开源异步并发框架的未来
http://segmentfault.com/a/1190000000471602 开源 Python 是开源的,介绍的这几个框架 Twisted.Tornado.Gevent 和 tulip 也都 ...
- Python开源异步并发框架
Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ...
- python并发编程之gevent协程(四)
协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...
- Disruptor 高性能并发框架二次封装
Disruptor是一款java高性能无锁并发处理框架.和JDK中的BlockingQueue有相似处,但是它的处理速度非常快!!!号称“一个线程一秒钟可以处理600W个订单”(反正渣渣电脑是没体会到 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- Awesome Python,Python的框架集合
Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awes ...
随机推荐
- iOS:图片相关(18-02-12更)
1.图片显示相关 1).图片聊天背景拉伸不失真 2).捏合.双击.下拉缩放 3).Banner.相册 4).动画 2.图片操作相关 1).获取.下载图片(分享.传图片用) 2).保存UIImage到本 ...
- Linux基础入门 第一章:Linux环境搭建——Redhat 6.4图文安装教程
1.创建新的虚拟机 2.选择自定义 3.选择Workstation 10.0 4.选择稍后安装操作系统 5.选择Red Hat 6 64位 6.对虚拟机命名和选择安装位置 7.选择处理器配置 8.选择 ...
- 在js中获取页面元素的属性值时,弱类型导致的诡异事件踩坑记录,
前几天写一个js的时候遇到一个非常诡异的事情,这个问题是这样的,我要获取一个页面的DOM元素的val值,判断这个值是否比某个变量大,这个需求原先数字最大也就是10,现在要改了,可能会更多,这个时候我发 ...
- php (zip)文件下载设置
普通下载头大概意思,文件输出的地方二选一,小文件下载.如文件较大时注意执行时间与内存使用.可以看php大文件下载 $filename = $_GET['filename']; $pathname = ...
- Windows.Devices API in a C# WinForm Win32 Desktop application in Windows 10
https://social.msdn.microsoft.com/Forums/windows/en-US/40b4f86d-b6d5-430e-a235-7fc003dec4c4/how-to-u ...
- Python--通过索引excel表将文件进行文件夹分类的脚本+读取指定目录下所有文件名的脚本
1.通过索引excel表将文件进行文件夹分类的脚本,此脚本由于将ip和id对应并生成对应id的文件夹将文件进行分类,也可以任意规定表格内容,通过vul_sc_ip.txt和xlsx文件进行索引. # ...
- verilog中初值定义
在利用verilog进行开发时,往往需要对某些寄存器进行赋初值,下面根据笔者在设计中遇到的情况进行分析. 例如下面是实现流水灯(4个led),代码如下: module ledrun ( input ...
- Linux Shell中管道的原理及C实现框架
在shell中我们经常用到管道,有没考虑过Shell是怎么实现管道的呢? cat minicom.log | grep "error" 标准输入.标准输出与管道 我们知道,每一个进 ...
- nodejs实现文件上传
在使用ant-design的upload上传文件时,前端很好实现,那么我们如何实现node服务端呢? 服务端文件上传实现 var express = require('express'); var f ...
- 20155203 实验四《 Android程序设计》实验报告
一.实验内容 实验项目一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十 ...