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用 ...
随机推荐
- 去掉MyEclipse 中烦人的黄线和感叹号!
Window>>Preferences>>General>>Editors>>Text Editors>>Annotations 选中右边的 ...
- HTTP 响应类型 ContentType 对照表
Ø 前言 1. 下面是 HTTP 响应类型 ContentType 的可选值,有备无患先保存一下.摘自:https://wiki.selfhtml.org/wiki/MIME-Type/%C3% ...
- bzoj 1531 Bank notes 多重背包/单调队列
多重背包二进制优化终于写了一次,注意j的边界条件啊,疯狂RE(还是自己太菜了啊啊)最辣的辣鸡 #include<bits/stdc++.h> using namespace std; in ...
- 基于Android 的蓝牙A2DP 功能的实现
摘 要:蓝牙(Bluetooth)技术是一种低成本的无线数据与数字通信的开放性全球规范. Android 是Google 于2007 年11 月5 日宣布的基于Linux平台开源手机操作系统名称,该平 ...
- [C++]PAT乙级1005. 继续(3n+1)猜想 (25/25)
/* 1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推 ...
- Food Log with Speech Recognition and NLP
1. 分词 word segmentation 国内有jieba 分词 2. Named Entity Recognition 训练自己的Model How can I train my own NE ...
- 第26月第9天 getActionBar为空的解决办法
1.python 包路径 export PYTHONPATH=路径 https://blog.csdn.net/machinezj/article/details/60137666 2.getActi ...
- 【css】正确的让文本换行
通常文本换行我们会使用word-break属性,有两个值供我们选择 word-break: break-all; word-break: break-world; 那么如何区分这两个值呢,我们看图说话 ...
- JDK在线API及常用工具类
API http://tool.oschina.net/apidocs/apidoc?api=jdk-zh Java SE常用工具类 java.util.Arrays java.util.Collec ...
- HTML - CSS 基础篇
网页主要由四部分组成: 1.内容(content) 图片.文本.多媒体等. 2.结构(structure) 框架布局(div+css布局的多行多列的结构.) 3.表现(presnetation) 修饰 ...