例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/

加了一些注释看懂了:

注释中的数字表示执行的顺序,这个简单的例子用到了python自带的生成器,关键的地方是:调用生成器的模块使用next()时就开始执行生成器中的语句,生成器执行到yield 的地方会挂起,同时返回yield的值给调用模块。当执行fire_event('click')时,会实现另外一个next(),这时生成器得到信号,从挂起的地方开始执行,直到结束。而在响应函数resume()中next()没有收到yield返回的值,所以会发生StopIteration异常.从而结束整个程序

#!/usr/bin/env python
#coding=utf-8 from time import sleep event_listeners = {} def fire_event(name):
event_listeners[name]() def use_event(func):
def call(*args, **kwargs):
print 'use_event' ## 1
generator = func(*args, **kwargs) ## 2
print 'come here' ## 3
event_name = generator.next() ## 4 开启generator,期待其返回一个yield()的值
print 'no wait here' ## 7 def resume():
try:
print 'second time' ## 10
next(generator) ##唤醒了test_work(),期待返回一个yield(),但是test_work只有一个yield(),所以这里会出现异常
except StopIteration:
print "test_work() doesn't have another yield()" ## 11
pass
event_listeners[event_name] = resume
print 'register !!' ## 8
return call @use_event
def test_work():
print 'wait' ## 5
sleep(2)
yield 'click'# 6 执行至此,返回'click'给use_event中的next();test_work()挂起,等待另一个next()唤醒
print 'click.' if __name__ == '__main__':
test_work()
sleep(3)
fire_event('click')#9 唤醒test_work()

关于python协程的一个例子的学习的更多相关文章

  1. Lua协程的一个例子

    很久没记录笔记了,还是养成不了记录的习惯 下面是来自 programming in lua的一个协程的例(生产者与用户的例子) 帖代码,慢慢理解 -- Programming in Lua Corou ...

  2. python协程初步---一个生成器的实现

    和列表那种一下占据长度为n的内存空间不同的是,生成器在调用的过程中逐步占据内存空间,因此有着很大的优势 一个斐波纳契数列的例子 def myfibbo(num): a,b=, count= while ...

  3. python协程初步---一个迭代器的实现

    一般认为迭代器就是实现了两个方法__iter__和__next__ 先创建这样一个类 from collections import Iterable from collections import ...

  4. Python 协程总结

    Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...

  5. 终结python协程----从yield到actor模型的实现

    把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...

  6. Python协程(真才实学,想学的进来)

    真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒. --蒙田<蒙田随笔全集> *** 上篇论述了关 ...

  7. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  8. 用yield实现python协程

    刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程. 引用官方的说法: 与线程相比,协程更轻量.一个python线程大概占用8M内存,而一个协程只占用1KB不到内存.协 ...

  9. python 协程(单线程中的异步调用)(转廖雪峰老师python教程)

    协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...

随机推荐

  1. Neo4j:Data Model Transformation:From Relation To Graph

    Here are some tips that help you with the transformation: Each entity table is represented by a labe ...

  2. mysql 密码重置

    1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql 2.使用命令启动mysql数据库,跳过权限验证 mysqld -nt --skip-grant-tables ...

  3. Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java

    Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java 1. 内存区域的划分 1 2. PermGen内存溢出深入分析 1 3. PermGen OOM原因总结 ...

  4. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

    atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类 ...

  5. paip. java的 函数式编程 大法

    paip. java的 函数式编程 大法 Java 语言中常被忽视的一个方面是它被归类为一种命令式(imperative)编程语言.命令式编程虽然由于与 Java 语言的关联而相当普及,但是并不是惟一 ...

  6. paip. java resin 远程 调试 java resin remote debug

    paip. java resin 远程 调试 java resin remote debug 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 ...

  7. Spark Scala 读取GBK文件的方法

    1. 在生产环境下,很多文件是GBK编码格式的,而SPARK 常用的textFile方法默认是写死了读UTF-8格式的文件,其他格式文件会显示乱码 用如下代码实现读取GBK文件的方法 import o ...

  8. JavaScript-语法基础

    在学习任何一门编程语言之前,我们都需要了解这门语言并学习这么语言的语法基础,掌握语法基础之后才可以进行一门语言的使用,本文在这里将详细介绍JavaScript的语法基础,使得以后能够快速的进行Java ...

  9. Maven学习总结(三)——使用Maven构建项目

    maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Java项目 1.1.创建Java Project 1.使用mvn archet ...

  10. LR11.0 下载及破解

    1. 把loadrunner相关程序全部退出:2. 用LR8.0中的mlr5lprg.dll.lm70.dll覆盖LR安装目录下“bin”文件夹中的对应文件:3. 清理注册表(不清理的话,在添加lic ...