4)协程一(yeild)
一:什么协程
协程: coroutine/coro
- 轻量级线程(一个线程)
- 调度由用户控制
- 有独立的寄存器上下文和栈
- 切换时保存状态,回来时恢复
二:协程和多线程比较
协程: coroutine/coro
- 轻量级线程(一个线程)
- 调度由用户控制
- 有独立的寄存器上下文和栈
- 切换时保存状态,回来时恢复
- 异步
- 一次调用,多个入口和结果
多进程,多线程
- 系统调度
- 上下文切换
- 占用内存
- 耗费CPU时间
- 同步
- 一次调用一次返回
三:python中协程发展
Python中协程的发展
•Python 2.5 (PEP 342) -> yield
•Python 3.3 (PEP 380) -> yield from
•Python 3.4 (PEP3156)-> asyncio
•Python 3.5 (PEP 0492).async/await
•Eventlet
•Greenlet
•gevent
四:协程使用发展
1.协程1期:模拟阶段
- 嵌套yield的函数交互运行
- next/send(None)激活yield
- send(data)向yield发送数据
示例1
import time def consumer():
r = ''
while True:
n = yield r #生成器,遇到yield就停止,并返回到porducer,等send信号,在继续向下执行,执行完了返回到yield处,并返回r
if not n:
return
print('[CONSUMR] Consuming %s' %n)
time.sleep(1)
r = '200 OK' def produce(c):
next(c) #第一次调用生成器
n = 0
while n < 5:
n += 1
print('[PRODUCE] Producing %s' % n)
r = c.send(n) #给生成器发送数据,并把yeild返回的数据给r
print('[PRODUCE] Producing %s' % r,n)
c.close() if __name__ == '__main__':
c = consumer()
produce(c)
协程yeild send
# _*_ coding:utf-8 _*_
__author__ = "lixiang"
from inspect import getgeneratorstate #协程使用生成器函数定义:定义体中有 yield 关键字
def simple_coro2(a):
print("started:a=",a) b=yield a #遇到yield就停止,并把a返回给调用方
print("received:b=",b)
c=yield a+b ##遇到yield就停止,并把a+b返回给调用方
print("received:c=",c)
#协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方
#如果没有return ,生成器会返回StopIteration异常 if __name__=="__main__": my_coro2=simple_coro2(14) #与创建生成器对象。
print(getgeneratorstate(my_coro2)) #inspect.getgeneratorstate生成器状态
r3=next(my_coro2) #next(my_coro2) 函数这一步通常称为“预激”(prime)协程==my_coro2.send(None)
print(r3) #
print(getgeneratorstate(my_coro2)) ##inspect.getgeneratorstate生成器状态 try:
#仅当协程处于暂停状态时才能调用 send 方法,激活生成器,并绘生成器传值
r1=my_coro2.send(28)
print(r1) # #生成器结束,传给 next 函数或 send 方法的调用方直接抛出异常
r2=my_coro2.send(99) #异常未执行
print(r2) #控制权流动到协程定义体的末尾,导致生成器像往常一样抛出 StopIteration异常
except StopIteration as e:
print(e) 结果
-----------------
GEN_CREATED
started:a= 14
14
GEN_SUSPENDED
received:b= 28
42
received:c= 99
无return获取不到返回值
示例2:带return:
# _*_ coding:utf-8 _*_
__author__ = "lixiang"
from inspect import getgeneratorstate
#协程使用生成器函数定义:定义体中有 yield 关键字
def simple_coro2(a):
print("started:a=",a)
b=yield a #遇到yield就停止,并把a返回给调用方
print("received:b=",b)
c=yield a+b ##遇到yield就停止,并把a+b返回给调用方
print("received:c=",c)
return c
if __name__=="__main__":
my_coro2=simple_coro2(14) #与创建生成器对象。
print(getgeneratorstate(my_coro2)) #inspect.getgeneratorstate生成器状态
r3=next(my_coro2) #next(my_coro2) 函数这一步通常称为“预激”(prime)协程==my_coro2.send(None)
print(r3) #
print(getgeneratorstate(my_coro2)) ##inspect.getgeneratorstate生成器状态
try:
#仅当协程处于暂停状态时才能调用 send 方法,激活生成器,并绘生成器传值
r1=my_coro2.send(28)
print(r1) #
#生成器结束,直接抛出异常
my_coro2.send(99)
#控制权流动到协程定义体的末尾,导致生成器像往常一样抛出 StopIteration异常
except StopIteration as e:
print(e)#获取return返回值
结果:---------
GEN_CREATED
started:a= 14
14
GEN_SUSPENDED
received:b= 28
42
received:c= 99
99
带return,获取返回值
4)协程一(yeild)的更多相关文章
- lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”
问题 attempt to yield across metamethod/C-call boundary 需求跟如下帖子中描述一致: http://bbs.chinaunix.net/forum.p ...
- Python协程一点理解
协程,又称微线程,纤程.英文名Coroutine. 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度.在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程 ...
- Kotlin 协程一 —— 全面了解 Kotlin 协程
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
- Unity中的协程(一)
这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines 这篇文章转自:http://blog.csdn. ...
- [转]Unity3D协程介绍 以及 使用
作者ChevyRay ,2013年9月28日,snaker7译 原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...
- python 自动化之路 day 10 协程、异步IO、队列、缓存
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- 带你简单了解python协程和异步
带你简单了解python的协程和异步 前言 对于学习异步的出发点,是写爬虫.从简单爬虫到学会了使用多线程爬虫之后,在翻看别人的博客文章时偶尔会看到异步这一说法.而对于异步的了解实在困扰了我好久好久,看 ...
- 线程&进程&协程
线程 线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.Threading用 ...
随机推荐
- SQL Server进阶(四):联接-cross join、inner join、left join、right jion、union、union all
测试数据脚本 CREATE TABLE Atable ( S# INT, Sname ), Sage INT, Sfrom ) ) insert into Atable ,N,N'A' union a ...
- Java入门系列 Java 中的四种引用
Why java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型 ...
- asp.net网页注释
asp.net页面上有一个asp控件,结果 使用<!-- -->注释不起作用,最后发现使用<%-- --%>注释可以.
- SQLite 数据库介绍和基本用法
Ø 简介 SQLite 是一款轻量级的关系型数据库,同时也是一种嵌入式数据库,与 Oracle.MySQL.SQL Server 等数据库不同,它可以内嵌在程序中,是程序中的一个组成部分.所以,经常 ...
- 对两个数求和的str_echo函数
void str_echo(int sockfd) { long arg1, arg2; ssize_t n; char line[MAXLINE]; for ( ; ; ) { ) { return ...
- 六、文件IO——fcntl 函数 和 ioctl 函数
6.1 fcntl 函数 6.1.1 函数介绍 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd ...
- 小程序开发 从简单的 crud 开始
关键字:“小程序 API” [WXML 完成布局] <view> == <div> {{}} == <%= %> ejs | jsp2 <block wx: ...
- /*+ hint*/用法,该如何解决
/*+ use_hash(b, a)*/用法SELECT /*+ use_hash(b, a)*/ 1, NVL(b.AgentWorkGroup, ' '), ................ ...
- [C++]Linux之文件拷贝在系统调用和C库函数下的效率比较
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 题目: 1. 分别利用文件的系统调用r ...
- valgrind 开发板调试
1.http://www.360doc.com/content/13/1205/13/7256015_334661588.shtml