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用 ...
随机推荐
- 魔改版BBR
魔改版bbr加速: wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSp ...
- luogu 2048 超级钢琴 贪心+堆+RMQ
此题求长度在l,r,之间内的区间的前k大之和 1.静态区间第k大,不就是主席树么! 可是不会写啊,以后填坑吧 2.优先队列 固定左端点,选取以此为起点的长度l<=x<=r的区间,固定此范围 ...
- 20155324 《Java程序设计》实验四 Android开发基础
20155324 <Java程序设计>实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件. ...
- Tensorflow Python 转 Java(一)
一.背景描述 最近python的tensorflow想办法给弄到线上去.网络用的Tensorflow现成的包.写篇博客,记录下过成.数据用kaggle中的数据为例子. 数据地址: https://ww ...
- 使用TensorFlow遇到的若干问题
一.查看版本: 进入到Python的命令行状态后,可以在终端输入查询命令如下: import tensorflow tensorflow.__version__ 查询tensorflow安装路径为: ...
- javaweb简单的实现文件下载
public HttpServletResponse download(HttpServletRequest request, HttpServletResponse response) throws ...
- Django REST Framework API Guide 03
本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...
- 2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目
2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目 结合本课程时间安排,以及同学们的专业和课程内容,制定了以下六个题目供各小组选择.如有其他项目方案设想,可自行与老师沟通.老 ...
- C - CodeCoder vs TopForces Gym - 101142C (连通块+思维)
题目链接: C - CodeCoder vs TopForces Gym - 101142C 题目大意:给你n个人的信息,每一个人的信息包括两个.t1和t2.A>B的前提是A的t1和t2至少有一 ...
- 用例该如何书写?完整示例-QQ登录界面
测试用例(case\测试点):指导软件测试工程师找bug的(思想逻辑的整理) 意义:1:怕忘:2:存档(让新人熟悉:产出):3:回归测试(软件即将上线之前,重新执行测试用例)--确认测试 书写测试用例 ...