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环境搭建的方法步骤
Feb 07 Python
详解django的serializer序列化model几种方法
Oct 16 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
python logging添加filter教程
Dec 24 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
Django日志及中间件模块应用案例
Sep 10 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 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开发工具之vs2005图解
2008/01/12 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
详解php协程知识点
2018/09/21 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python爬虫与反爬虫大战
2020/07/30 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
结对共建工作方案
2014/06/02 职场文书
销售代理协议书
2014/09/30 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
公司内部升职自荐信
2015/03/27 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS