用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三种主要类型介绍的也很细致
网友评论