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实现通过代理服务器访问远程url的方法
Apr 29 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
一篇文章快速了解Python的GIL
Jan 12 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
深入浅析python 中的匿名函数
May 21 Python
python中必要的名词解释
Nov 20 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 Python
python如何支持并发方法详解
Jul 25 Python
python 实现超级玛丽游戏
Nov 25 Python
使用django自带的user做外键的方法
Nov 30 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生成xml时添加CDATA标签的方法
2014/10/17 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
kali中python版本的切换方法
2019/07/11 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
学生实习推荐信范文
2013/11/26 职场文书
教育局长自荐信范文
2013/12/22 职场文书
企业总经理岗位职责
2014/02/13 职场文书
无偿献血倡议书
2014/04/14 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
家长学校工作方案
2014/05/07 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
邀请函的格式
2015/01/30 职场文书
第一书记观后感
2015/06/08 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis