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 相关文章推荐
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
在pycharm中设置显示行数的方法
Jan 16 Python
Python函数返回不定数量的值方法
Jan 22 Python
django-allauth入门学习和使用详解
Jul 03 Python
Django 反向生成url实例详解
Jul 30 Python
python web框架 django wsgi原理解析
Aug 20 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
python中turtle库的简单使用教程
Nov 11 Python
python 模拟登陆github的示例
Dec 04 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
Python编程super应用场景及示例解析
Oct 05 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
杏林同学录(七)
2006/10/09 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
用jscript实现列出安装的软件列表
2007/06/18 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
JS实现队列的先进先出功能示例
2017/05/10 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
Python异常处理总结
2014/08/15 Python
Python实现的tab文件操作类分享
2014/11/20 Python
Python简单进程锁代码实例
2015/04/27 Python
简单易懂的python环境安装教程
2017/07/13 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
使用Python的turtle模块画国旗
2019/09/24 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
医药大学生求职简历的自我评价
2013/10/17 职场文书
新闻专业应届生求职信
2013/10/31 职场文书
实习协议书范本
2014/04/22 职场文书
学生安全承诺书
2014/05/22 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
五年级语文教学反思
2016/03/03 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript