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用 ...
随机推荐
- JS创建对象之工厂模式
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = jo ...
- 【LDAP】LDAP注入漏洞与防御
0x01 前言 前两天爆了一个LDAP漏洞,据说存在了8年现在才被发现,感概一下,不知这8年来有多少站被搞了... 想着复现这个漏洞,就先复习一下LDAP注入的相关知识吧,差了很多资料,记一下笔记. ...
- 第26月第2天 vim javacomplete
1. 将解压出来的autoload 和 doc的内容添加到~/.vim/下的相应目录下,如果~/.vim下没有这两个文件夹就手动创建其中autoload里的有javacomplete.vim java ...
- sql连接:inner join on, left join on, right join on使用详解
点击打开原文 inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包 ...
- LOJ #2542「PKUWC2018」随机游走
$ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...
- Mybatis(二)入门程序-通过id查找用户、模糊查找用户、添加用户、删除用户
根据下图myBatis的架构,创建一个使用MyBatis的工程. 一.配置MyBatis 环境(如图) 1.sqlMapConfig.xml 首先,导入jar包(上图右边)并加载路径,然后 ...
- bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...
- MGR架构~高可用架构细节的梳理
一 简介:今天咱们来聊聊mgr的细节原理相关 二 选择新主机制 1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值 ...
- 【Java编程思想笔记】-集合2
详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A ...
- tomcat quartz 被触发两次
主要原因为tomcat server.xml 配置问题 <Host appBase="webapps" autoDeploy="true" name=&q ...