请稍候,加载中....

asyncio模块

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())

Python学习手册-