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框架的入门教程相关推荐

  1. python matplotlib模块教程_Python中的Matplotlib模块入门教程

    1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric ...

  2. 迷你MVVM框架 avalonjs 入门教程(司徒正美)

    迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板 ...

  3. 美团小程序框架mpvue入门教程

    美团小程序框架mpvue入门教程 自打写了 美团小程序框架mpvue蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本 ...

  4. 关于swift5以上的SnapKit框架的入门教程使用

    关于swift的SnapKit框架的入门教程使用 苹果在swift框架下面,一般使用snapKit进行纯代码的自动布局.常见的布局方式一种是纯代码,还有VFL,此语法较难,或者相对来说比较麻烦.还有s ...

  5. vue 美团框架_美团小程序框架mpvue入门教程

    美团小程序框架mpvue入门教程 本教程只针对新手,老鸟勿喷. 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋,可以直接去我的 github上克隆到本地, 安装一下依赖,即可直接 ...

  6. linux课程内容知识脉络,云计算学习路线教程大纲课件:Linux新手入门教程

    云计算学习路线教程大纲课件,Linux新手入门教程讲解: v> Shell编程之基础知识 No.1 Shell脚本的基本语法结构 第一行: "#!/usr/bin/env bash&q ...

  7. python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...

    本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...

  8. python自动化测试登录_Python selenium自动化测试框架入门实战--登录测试案例

    本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁. 本文应用到POM模型.selenium.unittest框架.configparser配置文件. ...

  9. python使用教程pandas-十分钟搞定pandas(入门教程)

    本文是对pandas官方网站上<10Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上 ...

最新文章

  1. linux chown 命令 更改设置文件对应的用户和组
  2. angularjs php登录验证,AngularJs表单验证的方法
  3. ctf图片隐写之修改图片高度
  4. java-HTMLjavaSkcriptCSSjQueryajax
  5. 【渝粤教育】电大中专常见病药物治疗 (2)作业 题库
  6. VS2017离线企业版,限时分享
  7. Spring boot(6) 数据访问
  8. Python、Java、C#、Perl 创始人聚首,编程语言要变天?
  9. [转载] 基本概念:java中的访问修饰符
  10. String常用函数
  11. (转)OpenStack Kilo 版本中 Neutron 的新变化
  12. Win系统 - 如何解决 Windows + P 键无法切换双显复制模式?
  13. 缓存设置(失效时间)
  14. Enigma密码机原理图解
  15. demonstration记忆_单词记忆法
  16. 电脑上找不到蓝牙图标,怎么打开蓝牙,三种方法教你打开蓝牙。
  17. 指导手册05:MapReduce编程入门
  18. 赊了两串冰糖葫芦才写出来的小结
  19. 计算机正确的录入指法教案,《文字录入教案》word版.doc
  20. TIA博途中无法添加HSP硬件支持包的解决办法

热门文章

  1. mongodb json_在MongoDB和Spring Batch中将XML转换为JSON和原始使用
  2. c++ lambda 重载_您会后悔对Lambdas应用重载!
  3. 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费
  4. JDBC –模拟序列
  5. Java中的命令设计模式
  6. 功能Java示例 第5部分–将I / O移到外部
  7. java内存模型和内存结构_Java内存模型和优化
  8. java 死锁 解决_Java死锁故障排除和解决
  9. Java中Array和ArrayList之间的9个区别
  10. antlr idea 入门_ANTLR:入门