https://zh.wikipedia.org/zh-cn/%E5%8D%8F%E7%A8%8B

协程可以理解为线程中的微线程,通过手动挂起函数的执行状态,在合适的时机再次激活继续运行,而不需要上下文切换。所以在python中使用协程会比线程性能更好。

Tornado协程

http://blog.csdn.net/wyx819/article/details/45420017

上面有大牛分析的Tornado的线程实现,依赖与Tornado的IOLoop,所以不能单独拿出来使用。有几个需要理解的概念:

  1. Future对象 用来保存异步获取到的结果,并在set_reslut的时候调用callback方法,把对应的callback方法放到ioloop的callback列表中等待下一次ioloop循环再执行
  2. 装饰器coroutine 在这个装饰器中实现了协程的调度,通过不断的调用next函数来不断获取Future对象,然后每次拿到Future对象在add_callback到ioloop上,等到Future被set_reslut后再次next,直到生成器中抛出Return的异常。

具体的实现过程不是很好描述,调度过程比较复杂,还是看看参考文章大牛的解析吧。

Greenlet

生成器实现的协程调度起来很麻烦,而且不是正在意义上的协程,只是实现的代码执行过程中的挂起,唤醒操作。而Greenlet这个Stackless的副产品则实现了真正的协程,在使用过程中通过switch来中断当前执行的函数,切换到另一个greenlet,在其它的geenlet 中调用switch会激活之前被挂起的协程。

Greenlet没有自己的调度过程,所以一般不会直接使用。以下参考文章是Greenlet get started的中文翻译。

http://www.importcjj.com/greenlet-qing-liang-ji-bing-fa-bian-cheng.html

Eventlet

http://blog.csdn.net/gaoxingnengjisuan/article/details/12913275
http://blog.csdn.net/gaoxingnengjisuan/article/details/12914831

Eventlet在Greenlet的基础上实现了自己的GreenThread,实际上就是greenlet类的扩展封装,而与Greenlet的不同是,Eventlet实现了自己调度器称为Hub,Hub类似于Tornado的IOLoop,是单实例的。在Hub中有一个event loop,根据不同的事件来切换到对应的GreenThread。
同时Eventlet还实现了一系列的补丁来使Python标准库中的socket等等module来支持GreenThread的切换。Eventlet的Hub可以被定制来实现自己调度过程。

Gevent

http://xlambda.com/gevent-tutorial/
http://www.open-open.com/lib/view/open1409705174822.html

Gevent的2架马车,libev与Greenlet。不同于Eventlet的用python实现的hub调度,Gevent通过Cython调用libev来实现一个高效的event loop调度循环。同时类似于Event,Gevent也有自己的monkey_patch,在打了补丁后,完全可以使用python线程的方式来无感知的使用协程,减少了开发成本。

在Python的世界里由于GIL的存在,线程一直都不是很好用,所以就有了各种协程的hack。Gevnet是当前使用起来最方便的协程了,但是由于依赖于libev所以不能在pypy上跑,如果需要在pypy上使用协程,Eventlet是最好的选择。

Python协程 Gevent Eventlet Greenlet的更多相关文章

  1. python协程gevent案例:爬取斗鱼美女图片

    分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图: 圈住的部分是我们需要 ...

  2. python 协程 gevent 简单测试

    串行测试 from gevent import monkey; monkey.patch_all()#有IO才做时需要这一句 import gevent import requests,time st ...

  3. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...

  4. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  5. python编程中的并发------协程gevent模块

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  6. python2.0_s12_day9_协程&Gevent协程

    Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 协程 1.协程,又 ...

  7. python协程和IO多路复用

     协程介绍                                                                                                ...

  8. 一起学Python:协程

    一:协程-yield 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一 ...

  9. python协程详解

    目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...

随机推荐

  1. zoj Candies 思维

    http://acm.zju.edu.cn/changsha/showProblem.do?problemId=31 题意: 给你n个非负整数,然后输入n个x[i],x[i] == -1表示第i个数不 ...

  2. 在iframe外层head中插入link

    let src = 'abc.css?v='+Math.random(); let link = window.parent.document.createElement('link'); link. ...

  3. Memento(备忘录)

    意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用性: 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它 ...

  4. Java中的基本数据类型及其封装类

    Java中的数据类型有两种,基本数据类型和引用数据类型,引用数据类型的创建是 需要去new一个对象,该对象的内存分配在堆区,同时栈区会保存一个指向该对象的引用, 但是对于一些简单数据的创建,用new的 ...

  5. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  6. RabbitMQ入门_01_简介与安装

    A. 资源与参考文档 官网:https://www.rabbitmq.com/ B. 学习目的 部门目前使用其他部门维护的 WebLogic 的 JMS 消息服务,缺乏足够的技术支持与运维支持.随着基 ...

  7. 使用 puppeteer 创建一个自动化导出 PDF 的服务

    最近在基于 RAP2 做内网的一个 API 管理平台,涉及到与外部人员进行协议交换,需要提供 PDF 文档. 在设置完成 CSS 后已经可以使用浏览器的打印功能实现导出 PDF,但全手动,总是觉得不爽 ...

  8. [sql]java.sql.Types的具体对应值(jdbcType)

    public final static int BIT   =  -7; public final static int TINYINT  =  -6; public final static int ...

  9. CPU上下文切换详解

    CPU上下文切换详解 原文地址,译文地址,译者: 董明鑫,校对:郑旭东 上下文切换(有时也称做进程切换或任务切换)是指CPU 从一个进程或线程切换到另一个进程或线程.进程(有时候也称做任务)是指一个程 ...

  10. Confluence 6 创建一个用户宏

    如果你想创建自定义的宏的话,用户宏能够帮你完成这个任务.这个可以在你系统中应用特定的操作,比如说应用自定义格式等. 用户用是在 Confluence 创建和和管理的,你需要有一定的编码基础才可以. 你 ...