关于python协程的一个例子的学习
例子来自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协程的一个例子的学习的更多相关文章
- Lua协程的一个例子
很久没记录笔记了,还是养成不了记录的习惯 下面是来自 programming in lua的一个协程的例(生产者与用户的例子) 帖代码,慢慢理解 -- Programming in Lua Corou ...
- python协程初步---一个生成器的实现
和列表那种一下占据长度为n的内存空间不同的是,生成器在调用的过程中逐步占据内存空间,因此有着很大的优势 一个斐波纳契数列的例子 def myfibbo(num): a,b=, count= while ...
- python协程初步---一个迭代器的实现
一般认为迭代器就是实现了两个方法__iter__和__next__ 先创建这样一个类 from collections import Iterable from collections import ...
- Python 协程总结
Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...
- 终结python协程----从yield到actor模型的实现
把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...
- Python协程(真才实学,想学的进来)
真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒. --蒙田<蒙田随笔全集> *** 上篇论述了关 ...
- 从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 ...
- 用yield实现python协程
刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程. 引用官方的说法: 与线程相比,协程更轻量.一个python线程大概占用8M内存,而一个协程只占用1KB不到内存.协 ...
- python 协程(单线程中的异步调用)(转廖雪峰老师python教程)
协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...
随机推荐
- [51单片机] TFT2.4彩屏3 [自制动画效果-滑块+吊钩]
>_<:引脚和前面几个连接一样,这里做了一个实用的动画效果,模拟起重机的2维视图. #ifndef __ILI9325_H__ #define __ILI9325_H__ void ILI ...
- Linux kernel develop -- Hello World
hello.c: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h&g ...
- 【Android 】Service 全面总结
1.Service的种类 按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...
- Maven学习总结(三)——使用Maven构建项目
maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Java项目 1.1.创建Java Project 1.使用mvn archet ...
- MySQL分区表
当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...
- Oracle的FRA(Flash Recovery Area)的好处
如果FRA的空间耗尽,只会影响到这个Oracle实例自身.所以不会耗尽所有磁盘空间从而影响到其它的数据库实例或其它应用.
- MongoDB图形化管理工具
NoSQL的运动不止,MongoDB 作为其中的主力军发展迅猛,也带起了一股开发图形化工具的风潮:气死反过来说,看一个产品是否得到认可,可以侧面看其第三方工具的数量和成熟程度:简单的收集了MongoD ...
- OpenCV相机标定和姿态更新
原帖地址: http://blog.csdn.net/aptx704610875/article/details/48914043 http://blog.csdn.net/aptx704610875 ...
- HTML5手机APP开发入(3)
HTML5手机APP开发入(3) 课程内容: 按照AngularJs MVC框架进行代码重构,新建一个DataService服务类使用SQLite插件实现储存对通讯录的本地存储. 涉及的知识点: An ...
- ios面试总结-
一 C语言方法的知识 1: const static voilite 修辞变量各代表什么意思? const 修辞的变量为常量,常量是不容许修改. static 修辞的变量为静态变量,在内存中 ...