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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
详解Python之unittest单元测试代码
Jan 24 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
python3爬取各类天气信息
Feb 24 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
python str字符串转uuid实例
Mar 03 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
Python读写csv文件流程及异常解决
Oct 20 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
将二维数组转为一维数组的2种方法
2014/05/26 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
Python读写锁实现实现代码解析
2020/11/28 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
公益广告语集锦
2014/03/13 职场文书
个人委托书
2014/07/31 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
公司人力资源管理制度
2015/08/05 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL