asyncio 是用来编写 异步并发 代码的库,使用 async/await
语法。
asyncio 被用作多个提供高性能 Python 异步框架的基础(python-xp.com就是使用了异步技术),包括网络和网站服务,数据库连接库,分布式任务队列等等。
asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。
async/await语法
async - 定义协程
await - 调用协程
async声明一个协程对象(coroutine object)
# async def my_do():
# 等待执行myfun,协程本身是一个可等待对象
# 中间一些需要io的操作,比如抓取网页,存储数据库
# print("hello world")
await用于调用在协程对象中调用另一个协程
# await 必须是在协程对象中使用
# async def other_do():
# await my_do()
协程执行 - coroutine
对象
使用async
定义的my_do
如果直接调用会生成一个coroutine
对象,而不是函数内部代码执行结果
# type(my_do())
# coroutine
执行协程,应该如下:
# try:
# my_do().send(None)
# except:
# pass
把这段代码封装一个run函数
# def run(coroutine):
# try:
# coroutine.send(None)
# except:
# pass
# run(my_do())
协程执行
asyncio.run示例
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
# 通过asyncio.run运行协程
asyncio.run(main())
asyncio并发运行示例
await直接
调用协程是按照顺序执行这些被调用协程,后一个被调用协程必须等前一个执行完毕
示例main
协程为主协程,内部通过asyncio.create_task
定义了两个任务,这两个任务
async def do1():
# 模拟执行耗时
await asyncio.sleep(3)
# 结果输出
print("hello, do1")
async def do2():
# 模拟执行耗时, do2耗时小一点,如果并发执行,应该在do1前完成
await asyncio.sleep(2)
# 结果输出
print("hello, do2")
async def main():
print(f"started at {time.strftime('%X')}")
await do1()
await do2()
print(f"ended at {time.strftime('%X')}")
asyncio.run(main())
上面的代码并不能并发执行
要并发执行需要使用asyncio.gather
async def concurrence_main():
print(f"started at {time.strftime('%X')}")
await asyncio.gather(do1(), do2())
print(f"ended at {time.strftime('%X')}")
asyncio.run(concurrence_main())
讨论区