您的位置:首页 > 编程语言 > Python开发

关于廖雪峰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