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数组的处理代码
Jan 04 Python
使用python解析xml成对应的html示例分享
Apr 02 Python
Python处理JSON数据并生成条形图
Aug 05 Python
不可错过的十本Python好书
Jul 06 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
详解python Todo清单实战
Nov 01 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
python实现多线程端口扫描
Aug 31 Python
python tkinter组件使用详解
Sep 16 Python
python函数不定长参数使用方法解析
Dec 14 Python
django实现模型字段动态choice的操作
Apr 01 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
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
深入了解Node.js中的一些特性
2014/09/25 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python requests模块实例用法
2019/02/11 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python同时迭代多个序列的方法
2020/07/28 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
人事主管岗位职责范本
2013/12/04 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
投资建议书模板
2014/05/12 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
2014年纠风工作总结
2014/12/08 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
MySQL表字段时间设置默认值
2021/05/13 MySQL
MySQL通过binlog恢复数据
2021/05/27 MySQL
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers