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实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
python 全文检索引擎详解
Apr 25 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 Python
python绘图模块之利用turtle画图
Feb 12 Python
python用tkinter开发的扫雷游戏
Jun 01 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Jun 11 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中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python的unittest测试类代码实例
2017/12/07 Python
python调用百度REST API实现语音识别
2018/08/30 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Python hashlib模块实例使用详解
2019/12/24 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
大学生职业生涯规划范文
2013/12/31 职场文书
烹调加工管理制度
2014/02/04 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
内乡县衙导游词
2015/02/05 职场文书
公司酒会致辞
2015/07/30 职场文书
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers