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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
Python中的装饰器用法详解
Jan 14 Python
python文件操作之目录遍历实例分析
May 20 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python与R语言的简要对比
Nov 14 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
python中实现栈的三种方法
Dec 19 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
php中的登陆login
2007/01/18 PHP
php数组使用规则分析
2015/02/27 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
南京某公司笔试题
2013/01/27 面试题
Unix如何添加新的用户
2014/08/20 面试题
大学生旅游业创业计划书
2014/01/29 职场文书
市场策划求职信
2014/08/07 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
2014财务年度工作总结
2014/11/11 职场文书
电力培训学习心得体会
2016/01/11 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js