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实现拓扑排序的基本教程
Mar 11 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
详解Django+Uwsgi+Nginx的生产环境部署
Jun 25 Python
对python调用RPC接口的实例详解
Jan 03 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
解决Python使用列表副本的问题
Dec 19 Python
Python各种扩展名区别点整理
Feb 27 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
如何利用python进行时间序列分析
Aug 04 Python
python 利用zmail库发送邮件
Sep 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
php变量范围介绍
2012/10/15 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
js事件(Event)知识整理
2012/10/11 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python批量爬取下载抖音视频
2019/06/17 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python实现粒子群算法的示例
2021/02/14 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
为什么使用接口?
2014/08/13 面试题
高级工程师岗位职责
2013/12/15 职场文书
在校学生职业规划范文
2014/01/08 职场文书
美术教学感言
2014/02/22 职场文书
教师对学生的评语
2014/04/28 职场文书
大学班级学风建设方案
2014/05/01 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
考试作弊检讨
2015/01/27 职场文书
二审代理词范文
2015/05/25 职场文书
奠基仪式致辞
2015/07/30 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android