关于廖雪峰yield,协程,异步的一些学习记录
2017-10-16 16:48
309 查看
参考链接:http://python.jobbole.com/87310/
廖雪峰的python教程。
yield 就是中断点,从yield这个地方中断
等价于:
简单说就是当执行到yield from的时候,后面函数的控制权被交到了eventloop手里,然后由eventloop决定何时执行。就是协程的函数如廖学峰老师例子里的hello函数和hello函数里的sleep函数现在处在并列关系。
感觉,这里的yield from 不能理解为类似return的东西,比如生成器那样。奇怪的是如果corotine就会中断,但是如果是普通函数则会等待。
如果是生成器,你需要send/next来让他继续执行,但是这里却不用执行,且这里为什么给r赋值呢?
简单理解:yield from 就是调用协程,就跟调用子程序一样。要创建一个协程,只需要用装士气@corotine就行了。调用协程就用yield from
看看生成器和协程的区别:
上面就是用生成器达到协程效果的代码。因为要跳转,所以需要用send来跳转。
coroutine装饰后可以直接通过yield from调用,不需要send来跳转了。
yield from就是调用两重generator以及coroutine的方法,注意@asyncio.coroutine
和@coroutine并不相同 @asyncio.coroutine装饰下的函数内不可以再调用@asyncio.coroutine装饰的函数,只能直接调用@coroutine装饰的generator。 @coroutine装饰的yield from返回的是个协程,普通的generator返回的是个结果。yield from 返回后会交给主进程执行。
yield from 必须在eventloop中才能使用,await必须在async中才能使用,实际上,yield from user.save()这个函数隐含在整个python写的框架里都是异步的这个前提里面。
作者:黄哥
链接:https://www.zhihu.com/question/54483694/answer/139545396
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
import asyncio
async def outer():
print('in outer')
print('waiting for result1')
result1 = await phase1()
print('waiting for result2')
result2 = await phase2(result1)
return (result1, result2)
async def phase1():
print('in phase1')
return 'result1'
async def phase2(arg):
print('in phase2')
return 'result2 derived from {}'.format(arg)
event_loop = asyncio.get_event_loop()
try:
return_value = event_loop.run_until_complete(outer())
print('return value: {!r}'.format(return_value))
finally:
event_loop.close()
如黄哥所写,outer函数是最外层的,这里是用到yield from的,但是里层可以不用yield from 和await这种语法,就是同步调用,这样好理解。但是如果里层又要调用异步函数的话又可以用await或者yield from来调用。python的异步调用,必须用到eventloop:廖老师网站
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143208573480558080fa77514407cb23834c78c6c7309000
1.必须用eventloop来处理
2.异步的函数必须用yield from或者await来调用
也就是说,一个地方异步了,他的上层的函数和上层函数调用他的方法也必须是异步的,如果不是会报:
也就是说:协程必须在协程中调用
廖雪峰的python教程。
yield 就是中断点,从yield这个地方中断
等价于:
简单说就是当执行到yield from的时候,后面函数的控制权被交到了eventloop手里,然后由eventloop决定何时执行。就是协程的函数如廖学峰老师例子里的hello函数和hello函数里的sleep函数现在处在并列关系。
感觉,这里的yield from 不能理解为类似return的东西,比如生成器那样。奇怪的是如果corotine就会中断,但是如果是普通函数则会等待。
如果是生成器,你需要send/next来让他继续执行,但是这里却不用执行,且这里为什么给r赋值呢?
简单理解:yield from 就是调用协程,就跟调用子程序一样。要创建一个协程,只需要用装士气@corotine就行了。调用协程就用yield from
看看生成器和协程的区别:
上面就是用生成器达到协程效果的代码。因为要跳转,所以需要用send来跳转。
coroutine装饰后可以直接通过yield from调用,不需要send来跳转了。
yield from就是调用两重generator以及coroutine的方法,注意@asyncio.coroutine
和@coroutine并不相同 @asyncio.coroutine装饰下的函数内不可以再调用@asyncio.coroutine装饰的函数,只能直接调用@coroutine装饰的generator。 @coroutine装饰的yield from返回的是个协程,普通的generator返回的是个结果。yield from 返回后会交给主进程执行。
yield from 必须在eventloop中才能使用,await必须在async中才能使用,实际上,yield from user.save()这个函数隐含在整个python写的框架里都是异步的这个前提里面。
作者:黄哥
链接:https://www.zhihu.com/question/54483694/answer/139545396
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
import asyncio
async def outer():
print('in outer')
print('waiting for result1')
result1 = await phase1()
print('waiting for result2')
result2 = await phase2(result1)
return (result1, result2)
async def phase1():
print('in phase1')
return 'result1'
async def phase2(arg):
print('in phase2')
return 'result2 derived from {}'.format(arg)
event_loop = asyncio.get_event_loop()
try:
return_value = event_loop.run_until_complete(outer())
print('return value: {!r}'.format(return_value))
finally:
event_loop.close()
如黄哥所写,outer函数是最外层的,这里是用到yield from的,但是里层可以不用yield from 和await这种语法,就是同步调用,这样好理解。但是如果里层又要调用异步函数的话又可以用await或者yield from来调用。python的异步调用,必须用到eventloop:廖老师网站
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143208573480558080fa77514407cb23834c78c6c7309000
1.必须用eventloop来处理
2.异步的函数必须用yield from或者await来调用
也就是说,一个地方异步了,他的上层的函数和上层函数调用他的方法也必须是异步的,如果不是会报:
也就是说:协程必须在协程中调用
相关文章推荐
- 关于前端开发学习中的一些小记录
- 【学习】关于学习编程,大神们的一些建议(记录学习中)
- 程序链接关于静态链接,动态链接,共享库,ABI的一些记录(os学习)
- Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会
- 关于前端开发学习中的一些小记录1
- 关于oracle数据库索引的一些学习记录
- 有关于递归函数的一些学习记录(Recursion)走楼梯,递归找出最两个数的大公约数,汉诺塔问题
- 20110126 学习记录:一些关于html中布局的代码 & CSS hack速查表
- 【ssh2学习记录】3、关于ssh2框架整合以及hibernate的一些总结
- 关于C# IEnumerator、yield、Unity3D协程的一些东西
- [学习记录]关于解决问题思路的一些反思
- 关于位操作学习的一些记录
- 关于C# webservice的一些学习记录,供自己学习查阅.
- Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会
- 初学Asp.net关于GridView的一些学习记录
- 关于linux的一些临时记录
- R语言的一些学习记录
- 一些关于学习和思维的思考
- 多线程学习记录2-java5的一些线程池
- 关于大脑的一些常识,学习中请注意灵活运用