美文网首页随笔-生活工作点滴
python 中 async/await个人学习笔记

python 中 async/await个人学习笔记

作者: blaze冰叔 | 来源:发表于2019-07-05 11:06 被阅读0次

用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。
为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。
请注意,async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:
把@asyncio.coroutine替换为async;
把yield from替换为await。

上面这段是在廖雪峰的教程中看到的一段介绍。

今天来谈谈自己学习中的一些理解

首先是 3.5之后的替换操作

3.5之前的使用

import asyncio
@asyncio.coroutine
def async_A():
    print('hello--%ld' % time.time())
    yield from asyncio.sleep(5)
    print('world--%ld' % time.time())
@asyncio.coroutine
def await_B():
    print('await_B--begin')
    result = yield from async_A()
    print('await_B--end')
    print(result)
if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(await_B())
    finally:
        loop.close()

3.5后的使用

import asyncio
async def async_A():
    print('hello--%ld' % time.time())
    await asyncio.sleep(5)
    print('world--%ld' % time.time())
async def await_B():
    print('await_B--begin')
    result = await async_A()
    print('await_B--end')
    print(result)
if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(await_B())
    finally:
        loop.close()

运行结果

await_B--begin
hello--1562652695
world--1562652700
await_B--end
None

在协程函数中,可以通过await语法来挂起自身的协程,并等待另一个协程完成直到返回结果。await语法只能出现在通过async修饰的函数中,否则会报SyntaxError错误。且await后面的对象需要是一个awaitable,有三种主要类型: 协程, 任务 和 Future.

import asyncio
import types

@types.coroutine
def async_A( x):
    yield from asyncio.sleep(5)
    return x

async def async_B(x,):
    result = await async_A(x)

loop = asyncio.get_event_loop()
loop.run_until_complete(async_B(1))
loop.close()

上面的代码使用了两种方式,async_A 和 async_B 都是协程对象

官方文档中对于awaitable三种主要类型介绍的也很细致

相关文章

网友评论

    本文标题:python 中 async/await个人学习笔记

    本文链接:https://www.haomeiwen.com/subject/vdeshctx.html