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 ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
Python set常用操作函数集锦
Nov 15 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
numpy下的flatten()函数用法详解
May 27 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
Python如何定义接口和抽象类
Jul 28 Python
Python设计密码强度校验程序
Jul 30 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
java字符串格式化输出实例讲解
Jan 06 Python
详解Python常用的魔法方法
Jun 03 Python
Python3接口性能测试实例代码
Jun 20 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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Python之指数与E记法的区别详解
2019/11/21 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
python代码区分大小写吗
2020/06/17 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
临床护理求职信
2014/04/26 职场文书
会计个人实习计划书
2014/08/15 职场文书
道歉信怎么写
2015/05/12 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
小学记事作文之200字
2019/08/06 职场文书