python gevent教程_Python的gevent框架的入门教程
Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。
gevent是第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:
from gevent import monkey; monkey.patch_socket()
import gevent
def f(n):
for i in range(n):
print gevent.getcurrent(), i
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()
运行结果:
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
可以看到,3个greenlet是依次运行而不是交替运行。
要让greenlet交替运行,可以通过gevent.sleep()交出控制权:
def f(n):
for i in range(n):
print gevent.getcurrent(), i
gevent.sleep(0)
执行结果:
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
3个greenlet交替运行,
把循环次数改为500000,让它们的运行时间长一点,然后在操作系统的进程管理器中看,线程数只有1个。
当然,实际代码里,我们不会用gevent.sleep()去切换协程,而是在执行到IO操作时,gevent自动切换,代码如下:
from gevent import monkey; monkey.patch_all()
import gevent
import urllib2
def f(url):
print('GET: %s' % url)
resp = urllib2.urlopen(url)
data = resp.read()
print('%d bytes received from %s.' % (len(data), url))
gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'),
gevent.spawn(f, 'https://www.yahoo.com/'),
gevent.spawn(f, 'https://github.com/'),
])
运行结果:
GET: https://www.python.org/
GET: https://www.yahoo.com/
GET: https://github.com/
45661 bytes received from https://www.python.org/.
14823 bytes received from https://github.com/.
304034 bytes received from https://www.yahoo.com/.
从结果看,3个网络操作是并发执行的,而且结束顺序不同,但只有一个线程。
小结
使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行。
由于gevent是基于IO切换的协程,所以最神奇的是,我们编写的Web App代码,不需要引入gevent的包,也不需要改任何代码,仅仅在部署的时候,用一个支持gevent的WSGI服务器,立刻就获得了数倍的性能提升。具体部署方式可以参考后续“实战”-“部署Web App”一节。
python gevent教程_Python的gevent框架的入门教程相关推荐
- python matplotlib模块教程_Python中的Matplotlib模块入门教程
1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric ...
- 迷你MVVM框架 avalonjs 入门教程(司徒正美)
迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板 ...
- 美团小程序框架mpvue入门教程
美团小程序框架mpvue入门教程 自打写了 美团小程序框架mpvue蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本 ...
- 关于swift5以上的SnapKit框架的入门教程使用
关于swift的SnapKit框架的入门教程使用 苹果在swift框架下面,一般使用snapKit进行纯代码的自动布局.常见的布局方式一种是纯代码,还有VFL,此语法较难,或者相对来说比较麻烦.还有s ...
- vue 美团框架_美团小程序框架mpvue入门教程
美团小程序框架mpvue入门教程 本教程只针对新手,老鸟勿喷. 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋,可以直接去我的 github上克隆到本地, 安装一下依赖,即可直接 ...
- linux课程内容知识脉络,云计算学习路线教程大纲课件:Linux新手入门教程
云计算学习路线教程大纲课件,Linux新手入门教程讲解: v> Shell编程之基础知识 No.1 Shell脚本的基本语法结构 第一行: "#!/usr/bin/env bash&q ...
- python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...
本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...
- python自动化测试登录_Python selenium自动化测试框架入门实战--登录测试案例
本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁. 本文应用到POM模型.selenium.unittest框架.configparser配置文件. ...
- python使用教程pandas-十分钟搞定pandas(入门教程)
本文是对pandas官方网站上<10Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上 ...
最新文章
- linux chown 命令 更改设置文件对应的用户和组
- angularjs php登录验证,AngularJs表单验证的方法
- ctf图片隐写之修改图片高度
- java-HTMLjavaSkcriptCSSjQueryajax
- 【渝粤教育】电大中专常见病药物治疗 (2)作业 题库
- VS2017离线企业版,限时分享
- Spring boot(6) 数据访问
- Python、Java、C#、Perl 创始人聚首,编程语言要变天?
- [转载] 基本概念:java中的访问修饰符
- String常用函数
- (转)OpenStack Kilo 版本中 Neutron 的新变化
- Win系统 - 如何解决 Windows + P 键无法切换双显复制模式?
- 缓存设置(失效时间)
- Enigma密码机原理图解
- demonstration记忆_单词记忆法
- 电脑上找不到蓝牙图标,怎么打开蓝牙,三种方法教你打开蓝牙。
- 指导手册05:MapReduce编程入门
- 赊了两串冰糖葫芦才写出来的小结
- 计算机正确的录入指法教案,《文字录入教案》word版.doc
- TIA博途中无法添加HSP硬件支持包的解决办法
热门文章
- mongodb json_在MongoDB和Spring Batch中将XML转换为JSON和原始使用
- c++ lambda 重载_您会后悔对Lambdas应用重载!
- 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费
- JDBC –模拟序列
- Java中的命令设计模式
- 功能Java示例 第5部分–将I / O移到外部
- java内存模型和内存结构_Java内存模型和优化
- java 死锁 解决_Java死锁故障排除和解决
- Java中Array和ArrayList之间的9个区别
- antlr idea 入门_ANTLR:入门