Python的网络编程库Gevent的安装及使用技巧


Posted in Python onJune 24, 2016

安装(以CentOS为例)
gevent依赖libevent和greenlet:
1.安装libevent
直接yum install libevent
然后配置python的安装
2.安装easy_install
(1)

wget -q http://peak.telecommunity.com/dist/ez_setup.py

(2)使用

python ez_setup.py

(3)使用easy_install 查看命令是否可用,如果不可用可以讲路径加入到PATH中
3.安装greenlet
(1)

yum install python-devel

(2)

easy_install greenlet

4.安装gevent

pip install cython -e git://github.com/surfly/gevent.git@1.0rc2#egg=gevent

使用技巧
Gevent库性能很高,但一直以来我都纠结在python的GIL模型导致的线程不能抢占多核资源上面。
而启动多个python进程的这种利用多核的模式又需要增加前端负载均衡,比如lvs那些,有些麻烦。
multiprocessing模块和os.fork又会使得两个进程重复在事件核心注册accept事件,导致文件句柄重复的异常。
至于一个进程监听,多个进程处理的模式,监听的那个进程资源又不好分配——是独立分配一个核心还是不单独分配呢?如果单独分配,连接量小的时候就浪费了一个核心,如果不分配,连接量大的时候cpu又会频繁切换进程。
昨日才发现原来gevent是可以很轻松地将它的网络模型分布到多个进程并行处理的。
秘诀就在gevent.fork()。
以前想当然地认为gevent.fork只是greenlet.spawn的一个包装,原来不是这样。gevent.fork能替代os.fork,不仅会启动一个新的进程,而且能将它们底层的事件处理沟通起来,进行并行处理。

import gevent
from gevent.server import StreamServer

def eat_cpu():
  for i in xrange(10000): pass

def cb(socket, address):
  eat_cpu()
  socket.recv(1024)
  socket.sendall('HTTP/1.1 200 OK\n\nHello World!!')
  socket.close()

server = StreamServer(('',80), cb, backlog=100000)
server.pre_start()

gevent.fork()

server.start_accepting()
server._stopped_event.wait()

 打上monkey.patch_os后,os.fork就可以被gevent.fork替代了,这样同时multiprocessing模块也可以像往常一样使用,并达到并行处理的效果了。

from gevent import monkey; monkey.patch_os()
from gevent.server import StreamServer
from multiprocessing import Process

def eat_cpu(): 
  for i in xrange(10000): pass

def cb(socket, address):
  eat_cpu()
  socket.recv(1024)
  socket.sendall('HTTP/1.1 200 OK\n\nHello World!!')
  socket.close()

server = StreamServer(('',80), cb, backlog=100000)
server.pre_start()

def serve_forever():
  server.start_accepting()
  server._stopped_event.wait()

process_count = 4

for i in range(process_count - 1):
  Process(target=serve_forever, args=tuple()).start()

serve_forever()
Python 相关文章推荐
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
python字典操作实例详解
Nov 16 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Django Celery异步任务队列的实现
Jul 24 Python
Django发送邮件功能实例详解
Sep 02 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
pycharm永久激活超详细教程
Oct 29 Python
pandas 操作 Excel操作总结
Mar 31 Python
python异步的ASGI与Fast Api实现
Jul 16 Python
深入解析Python编程中super关键字的用法
Jun 24 #Python
深入了解Python数据类型之列表
Jun 24 #Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 #Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 #Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 #Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 #Python
Python基础篇之初识Python必看攻略
Jun 23 #Python
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
php循环输出数据库内容的代码
2008/05/24 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
实例讲解React 组件
2020/07/07 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
python tkinter canvas使用实例
2019/11/04 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
小学教师师德感言
2014/02/10 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript