赞
踩
Python中有四种常见函数类型:
# 1. 普通函数 FunctionType
def function():
return 1
# 2. generator function :GeneratorType
def generator():
yield 2 # 生成器
# async修饰将普通函数和生成器函数包装成异步函数和异步生成器
# 3. 异步函数(协程) :CoroutineType
async def async_function():
return 3
# 4. 异步生成器 : AsyncGeneratorType
async def async_function():
yield 4
直接调用异步函数不会返回结果,而是返回一个coroutine
对象。
协程需要通过其他方式来驱动,可以通过这个协程对象的send方法给协程发送一个值。
在协程函数中,可以通过await语法来挂起自身的协程,并等待另一个协程完成直到返回结果。
async def async_function():
return 1
async def await_coroutine():
result = await async_function() # await只能出现在通过async修饰的函数中;其后是一个awaitable
print(result)
run(await_coroutine())
实现了__await__
方法的类。
需要实现__aiter__、__anext__两个核心方法,以及asend、athro、aclose方法。
完成异步的代码不一定要用async/await;
使用了async/await的代码也不一定能做到异步;
async/await是协程的语法糖,使协程之间的调用变得更加清晰:
常规函数开始执行后一直运行到return
实现退出,如果需要能够中断的函数,就需要添加async
关键字。
async
用来声明一个函数为异步函数,异步函数的特点就是能在函数执行过程中被挂起,去执行其他异步函数,等挂起条件消失后再回来执行。
await
用来声明程序挂起。
await
后面只能跟异步程序或有__await__
属性的对象。
两个异步程序async a、async b:
- a中一步有await,当程序碰到关键字await b后;
- 异步程序a挂起,去执行异步b程序(就相当于从一个函数内部跳出去执行其他函数);
- 当挂起条件小时候,不管b是否执行完,要马上从b程序中跳出来,回到原程序a执行原来的操作;
如果await后面跟的b函数不是异步函数,那么操作就只能等b执行完再返回,无法在b执行的过程中返回,这样就相当于直接调用b函数,没必要使用await关键字了。
因此,需要await后面跟的是异步函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。