一:什么协程

协程: 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)的更多相关文章

  1. lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”

    问题 attempt to yield across metamethod/C-call boundary 需求跟如下帖子中描述一致: http://bbs.chinaunix.net/forum.p ...

  2. Python协程一点理解

    协程,又称微线程,纤程.英文名Coroutine. 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度.在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程 ...

  3. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  4. Unity中的协程(一)

    这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines   这篇文章转自:http://blog.csdn. ...

  5. [转]Unity3D协程介绍 以及 使用

    作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...

  6. python 自动化之路 day 10 协程、异步IO、队列、缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...

  7. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  8. 带你简单了解python协程和异步

    带你简单了解python的协程和异步 前言 对于学习异步的出发点,是写爬虫.从简单爬虫到学会了使用多线程爬虫之后,在翻看别人的博客文章时偶尔会看到异步这一说法.而对于异步的了解实在困扰了我好久好久,看 ...

  9. 线程&进程&协程

    线程 线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.Threading用 ...

随机推荐

  1. 魔改版BBR

    魔改版bbr加速: wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSp ...

  2. luogu 2048 超级钢琴 贪心+堆+RMQ

    此题求长度在l,r,之间内的区间的前k大之和 1.静态区间第k大,不就是主席树么! 可是不会写啊,以后填坑吧 2.优先队列 固定左端点,选取以此为起点的长度l<=x<=r的区间,固定此范围 ...

  3. 20155324 《Java程序设计》实验四 Android开发基础

    20155324 <Java程序设计>实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件. ...

  4. Tensorflow Python 转 Java(一)

    一.背景描述 最近python的tensorflow想办法给弄到线上去.网络用的Tensorflow现成的包.写篇博客,记录下过成.数据用kaggle中的数据为例子. 数据地址: https://ww ...

  5. 使用TensorFlow遇到的若干问题

    一.查看版本: 进入到Python的命令行状态后,可以在终端输入查询命令如下: import tensorflow tensorflow.__version__ 查询tensorflow安装路径为: ...

  6. javaweb简单的实现文件下载

    public HttpServletResponse download(HttpServletRequest request, HttpServletResponse response) throws ...

  7. Django REST Framework API Guide 03

    本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...

  8. 2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目

    2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目 结合本课程时间安排,以及同学们的专业和课程内容,制定了以下六个题目供各小组选择.如有其他项目方案设想,可自行与老师沟通.老 ...

  9. C - CodeCoder vs TopForces Gym - 101142C (连通块+思维)

    题目链接: C - CodeCoder vs TopForces Gym - 101142C 题目大意:给你n个人的信息,每一个人的信息包括两个.t1和t2.A>B的前提是A的t1和t2至少有一 ...

  10. 用例该如何书写?完整示例-QQ登录界面

    测试用例(case\测试点):指导软件测试工程师找bug的(思想逻辑的整理) 意义:1:怕忘:2:存档(让新人熟悉:产出):3:回归测试(软件即将上线之前,重新执行测试用例)--确认测试 书写测试用例 ...