yield, async
yield实现斐波那契序列:
import sys, time def fib():
a,b,c = 0,1,0
while True:
yield c
a,b = b, c
c = a + b if __name__ == '__main__':
fib_iter = fib()
for i in range(int(sys.argv[1])):
print(fib_iter.__next__())
Send:
send函数用来向fib_iter发送数据,这样数据就可以双向流动。我们尝试使用send来模拟一个比较慢的生成器,我们让它一秒钟生成一个数:
import sys, time def fib():
a,b,c = 0,1,0
while True:
sleep_sec = yield c
time.sleep(sleep_sec)
a,b = b, c
c = a + b def fib1():
index = 1
a = 0
b = 1
while index:
yield b
a, b = b, a + b
index += 1 if __name__ == '__main__':
fib_iter = fib()
print(fib_iter.__next__()) #先执行一下,让它停留在yield
for i in range(int(sys.argv[1])):
result = fib_iter.send(1) #
print(result)
yield from 是什么?
在上面的yield中,我们通过for循环使用__next__()方法来获取下一个值,也就是说想要获取下一个值就要重新yield一下;yield from 它可以简化这个过程,看看实例:
import sys, time def fib(n):
a,b,c = 0,1,0
while c < n:
yield c
a,b = b, c
c = a + b def gener(n):
yield from fib(n) if __name__ == '__main__':
print(list(gener(5000)))
执行结果:
D:\>python fib.py
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4
181]
yield from , send传递信息:
import sys, time def fib(n):
a,b,c = 0,1,0
while c < n:
sleep_sec = yield c
time.sleep(sleep_sec)
a,b = b, c
c = a + b def gener(n):
yield from fib(n) if __name__ == '__main__':
gen = gener(10)
print(gen.send(None))
print(gen.send(1))
print(gen.send(1))
执行结果:
D:\>python fib.py
0
1
1
asyncio 和 yield from:
asyncio是一个基于事件循环的实现异步的I/O模块。通过yield from, 我们可以将协程asynico.sleep的控制权交给事件循环,然后挂起当前协程;之后,由事件循环决定何时唤醒asyncio.sleep,然后接着执行后面的代码; 实例中我们用sleep来模拟阻塞:
import sys, time, asyncio def fib(n):
a,b,c = 0,1,0
while c < n:
yield from asyncio.sleep(2)
print('-->', c)
a,b = b, c
c = a + b def stupid_fib(n):
a,b,c = 0,1,0
while c < n:
yield from asyncio.sleep(2)
print('==>', c)
a,b = b,c
c = a + b if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = [asyncio.async(fib(10)), asyncio.async(stupid_fib(10))]
loop.run_until_complete(asyncio.wait(tasks))
print('all task finished')
loop.close()
执行结果:
D:\>python fib.py
--> 0
==> 0
--> 1
==> 1
--> 1
==> 1
--> 2
==> 2
--> 3
==> 3
yield, async的更多相关文章
- ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...
- 理解Python协程:从yield/send到yield from再到async/await
Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...
- [转] Understanding JavaScript’s async await
PS:Promise的用处是异步调用,这个对象使用的时候,call then函数,传一个处理函数进去,处理异步调用后的结果 Promise<Action>这样的对象呢,异步调用后的结果是一 ...
- async/await 的基本实现和 .NET Core 2.1 中相关性能提升
前言 这篇文章的开头,笔者想多说两句,不过也是为了以后再也不多嘴这样的话. 在日常工作中,笔者接触得最多的开发工作仍然是在 .NET Core 平台上,当然因为团队领导的开放性和团队风格的多样性(这和 ...
- python---await/async关键字
推文:玩转 Python 3.5 的 await/async 首先看正常的两个函数之间的执行 def func1(): print("func1 start") print(&qu ...
- cps变换
网上看了很多内容,很少有给出一个准确的概念,它的英文全称是continuous passing style, 直译为连续传递样式,那么cps transform就是将一些原本不是continuous ...
- typescript 的 polyfill 学习
我们知道typescript 是ES 超集.这意味着,不仅仅ES 的各种语法特性都会包括,还能保证通过typescript的编译服务可以很方便的转成ES向下兼容的版本,这得意于typescript强大 ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- es7预览
哈哈,es6才刚刚掌握,就给大家介绍es7了. es7的草案其实早已经定下来了,而且更加向着java这些高级语言看齐了 chrome的高版本其实也已经对es7的部分功能实现了!! 1.数组 inclu ...
随机推荐
- python XML梳理
导入ElementTree模块 import xml.etree.ElementTree as ET 为了创建一个element实例,使用Element 构造函数或者SubElement()工厂函数. ...
- 关闭ubuntu dash 方法
因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell, ...
- OpenStack 云主机深入了解(十四)
云主机深入了解 1.云主机在计算节点以进程方式运行 2.监听vnc的端口,vnc默认端口从5900开始, 多台云主机,端口递增 3.云主机桥接网卡,与宿主机联通网络 提示:在openstack环境下, ...
- 怎么使用 JavaScript 将网站后台的数据变化实时更新到前端
实时这个工作现在大体有两种方法一.前端不断地向后台轮询请求数据查询的接口(不管你是用AJAX还是什么)然后将返回的数据重绘在页面上,这以前端页面为主动的方式.二.如果浏览器支持Websocket 那么 ...
- Spark记录-Scala函数
Scala函数 Scala有函数和方法. Scala方法是一个具有名称和签名的类的一部分. Scala中的函数是一个可以分配给变量的完整对象. 函数定义可以出现在源文件中的任何位置. 不带参数的函数 ...
- win10内建子系统Linux
从cmd中下载linux和linux终端安装程序一样 最新要从商店购买(当然是免费) ubuntu openSUSE SUSE 3个 创建用户
- 01:MFC应用程序编程
一 MFC的发展 VC 1.0->VC 5.0->VC 6.0->VC2008 SP1)->VS2010 二 MFC基础 1 MFC 微软基础类库 采用类的方式,将Win32 ...
- 对linux内核中jiffies+Hz表示一秒钟的理解
jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/linux/jiffies.h中,定义形式如下. unsigned long volat ...
- su: cannot set user id: Resource temporarily unavailable【转】
今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...
- Coursera台大机器学习技法课程笔记14-Radial Basis Function Network
将Radial Basis Function与Network相结合.实际上衡量两个点的相似性:距离越近,值越大. 将神经元换为与距离有关的函数,就是RBF Network: 可以用kernel和RBF ...