一、介绍
在Python 3.5中引入了async和await关键字,用于异步编程。async关键字用于定义一个协程(coroutine),而await关键字则用于等待一个协程完成。
注:协程(coroutine)是是一种轻量级的线程,但相对子线程而言,协程更为一般和灵活,在实践中没有子线程那样使用广泛。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。
二、使用
- 异步函数:使用async def定义的函数是异步函数。它们可以包含await关键字,以等待异步操作完成。异步函数在被调用时不会立即执行,而是返回一个协程对象。
- await 关键字:在异步函数中,await关键字用于暂停当前协程的执行,等待某个异步操作完成,然后再继续执行。
import asyncio
async def foo():
print("Foo start")
await asyncio.sleep(2) # 模拟耗时操作
print("Foo end")
async def bar():
print("Bar start")
await asyncio.sleep(1) # 模拟耗时操作
print("Bar end")
async def main():
await asyncio.gather(foo(), bar()) # 并发运行foo()和bar()
asyncio.run(main()) # Python 3.7+
在上面的示例中,asyncio.run(main())
会运行main()
函数,而main()
函数使用asyncio.gather()
来并发运行foo()
和bar()
。在foo()
和bar()
中,await asyncio.sleep()
模拟了异步操作,使得在等待的期间可以切换到其他任务。
另一个例子
import asyncio
async def others():
print("start")
await asyncio.sleep(2)
print('end')
return '返回值'
async def func():
print("执行协程函数内部代码")
# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其他协程(任务)。
response1 = await others()
print("IO请求结束,结果为:", response1)
response2 = await others()
print("IO请求结束,结果为:", response2)
asyncio.run( func() )
三、总结
使用async和await关键字可以大大简化异步编程的代码,使其更易于理解和维护。
参考: