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 list使用示例 list中找连续的数字
Jan 27 Python
python一键升级所有pip package的方法
Jan 16 Python
Python 文件处理注意事项总结
Apr 10 Python
python Pygame的具体使用讲解
Nov 03 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python numpy数组中的复制知识解析
Feb 03 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
python基于opencv批量生成验证码的示例
Apr 28 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
phpwind中的数据库操作类
2007/01/02 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python plotly绘制直方图实例详解
2019/07/22 Python
自我鉴定标准格式
2014/03/19 职场文书
推荐信怎么写
2014/05/09 职场文书
商业项目策划方案
2014/06/05 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
2015新教师教学工作总结
2015/07/22 职场文书