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多线程编程(六):可重入锁RLock
Apr 05 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
浅谈python新手中常见的疑惑及解答
Jun 14 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
python try except 捕获所有异常的实例
Oct 18 Python
python监测当前联网状态并连接的实例
Dec 18 Python
pandas的排序和排名的具体使用
Jul 31 Python
python__name__原理及用法详解
Nov 02 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 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 数学运算验证码实现代码
2009/10/11 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
srcElement表格样式
2006/09/03 Javascript
js宝典学习笔记(上)
2007/01/10 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Django工程的分层结构详解
2019/07/18 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python Gabor滤波器讲解
2020/10/26 Python
Python可以用来做什么
2020/11/23 Python
python用700行代码实现http客户端
2021/01/14 Python
全球工业:Global Industrial
2020/02/01 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
公司活动方案范文
2014/03/06 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android