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设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
Python中的TCP socket写法示例
May 11 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
使用Python封装excel操作指南
Jan 29 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
javascript实现拖放效果
2015/12/16 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
浅谈对yield的初步理解
2017/05/29 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
几个MySql的面试题
2013/04/22 面试题
员工年终演讲稿
2014/01/03 职场文书
岗位工作说明书
2014/07/29 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
2016春节家属慰问信
2015/03/25 职场文书
运动会广播稿50字
2015/08/19 职场文书
新学期家长寄语2016
2015/12/03 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
索尼ICF-36收音机评测
2022/04/30 无线电