文档章节

python Gevent – 高性能的Python并发框架

netmouse
 netmouse
发布于 2015/02/03 17:42
字数 1127
阅读 285
收藏 12

Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。

于greenlet、eventlet相比,性能略低,但是它封装的API非常完善,最赞的是提供了一个monkey类,可以将现有基于Python线程直接转化为greenlet,相当于proxy了一下(打了patch)。

今天有空就迫不及待的试一下效果。

1、安装

Gevent依赖libevent和greenlet,需要分别安装。

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版本,所以某些时候比线程版本性能好。

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()

线程版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from SocketServer import ThreadingMixIn

from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler

 

#Threaded XML-RPC

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()

3、测试客户端

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)

4、gevent的monkey包装后的XML-RPC

monkey是非入侵式的patch,只需要显示调用你需要patch的东西就行了,别看我用了三行,其实可以patch_all()的

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 ’1024\t65535′ | 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的方法,如下:

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的性能不降反升,而默认的则在不断下降)

本文转载自:http://www.coder4.com/archives/1522

netmouse
粉丝 4
博文 85
码字总数 32292
作品 0
青岛
部门经理
私信 提问
156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横
2018/05/02
0
0
gevent 1.1 发布,高性能Python并发框架

gevent 1.1 发布了,该版本主要的改进是增加对 Python 3 和 PyPy 的支持,同时修复了很多 bug。完整的改进记录请看 What's New 和 ChangeLog 页面。 Gevent是一个基于greenlet的Python的并发...

oschina
2016/03/06
1K
1
Gevent 1.0.1 发布,高性能的 Python 并发框架

-这是一个小的维护版本。 - 升级libev至4.15。修正了#361BUG:在ARMv5架构上面安装时会失败。 - 对Win64的更好的支持。感谢Alexey Borzenkov提供的补丁。 - 修正了#423BUG。基于WangJian ...

铂金小马
2014/05/03
1K
0
Python并发之Gevent

Python并发之gevent Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。 gevent是第三方库,通过greenlet实现协程,其基本思想是: ...

_Change_
2018/10/12
0
0
Ubuntu 安装gevent

Gevent是一个基于greenlet的Python的并发框架,以赖于greenlet和libevent库,因此安装Gevent前,首先需要安装greenlet和libevent。 libevent的安装,这里就不介绍了,网上的安装教程一大箩,...

jackliu8722
2012/07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部