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 ...
随机推荐
- java基础基础总结----- 随机数(产生四个随机数)
前言:在开发的时候经常会遇见,一些验证码登录,其实这些东西,很简单.我曾经开发过一个验证码登录的页面,那时用的插件.但是作为一个合格的开发者,要了解其内部的核心知识,有些东西,可以不深入了解,但是要做 ...
- Hadoop生态圈-Flume的组件之自定义Sink
Hadoop生态圈-Flume的组件之自定义Sink 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍sink相关的API使用两个小案例,想要了解更多关于API的小技 ...
- 初识python面向对象编程
初识python面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.面向过程的程序设计思想 #!/usr/bin/env python #_*_coding:utf-8 ...
- bzoj千题计划277:bzoj4513: [Sdoi2016]储能表
http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...
- bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特
http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇 ...
- 转 -----那些年总也记不牢的IO
关于资源关闭: 一般情况下是:先打开的后关闭,后打开的先关闭 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b 例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b 当然完 ...
- python学习笔记6--mockserver
一.mockserver的应用 有时候测试我们需要调用一些三方接口或者未开发完成的接口,完成我们的业务流程测试,但是这时候可能我们只知道接口返回值,接口并没有完全开发完成或可以让我们任意调用,这时候就 ...
- 求二叉树中第K层结点的个数
一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...
- dialog 菜单
dialog 菜单 # 默认将所有输出用 stderr 输出,不显示到屏幕 使用参数 --stdout 可将选择赋给变量 # 退出状态 0正确 1错误 窗体类型 --calendar # 日历 --c ...
- python模块分析之time和datetime模块
前言 我们使用time和datetime模块的主要目的是对时间戳.时间字符串.时间元组等时间的表述对象进行相互的转化.而我们平时编码涉及两个时间:一个是上海时间,也可以说是北京时间,一个是UTC时间, ...