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实现将数据库一键导出为Excel表格的实例
Dec 30 Python
python+pygame简单画板实现代码实例
Dec 13 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Python模块汇总(常用第三方库)
Oct 07 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
python for循环赋值问题
Jun 03 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
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
动态控制Table的js代码
2007/03/07 Javascript
javascript的对话框详解与参数
2007/03/08 Javascript
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
日期 时间js控件
2009/05/07 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python爬取成语接龙类网站
2018/10/19 Python
python对象与json相互转换的方法
2019/05/07 Python
Python如何调用JS文件中的函数
2019/08/16 Python
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
应届毕业生自荐信
2014/05/28 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年个人售房协议书
2014/10/30 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
开工典礼致辞
2015/07/29 职场文书
周一问候语大全
2015/11/10 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫