文档

csdn
https://blog.csdn.net/qq_43380180/article/details/111573642

基础语法

import asyncio
async def main():
     print('hello')
     await asyncio.sleep(1)
    print('world')
asyncio.run(main())

启动命令

执行 coroutine coro 并返回结果

  • asyncio.run(coro, *, debug=False)
    此函数会运行传入的协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭线程池
    理想情况下应当只被调用一次
asyncio.run(main())

Task并行运行

  • asyncio.create_task(coro, *, name=None) 函数用来并发运行作为asyncio 任务 的多个协程
  • 通过 asyncio.create_task()等函数封装为一个任务,该协程会被自动调度执行
  • 也可用低层级的 loop.create_task() 或 ensure_future() 函数
task1=asyncio.create_task(main1())
task2=asyncio.create_task(main2())
await task1  #等待1运行完成,在1内io等待期task2同时运行
await task2  #等待2运行完成

asyncio.gather 并发运行任务

asyncio.gather(*aws, return_exceptions=False)

  • 在 3.10 版 移除了 loop 形参
async def main():
    L = await asyncio.gather(fun1("A", 2), fun2("B", 3),  fun3("C", 4) )
    print(L)

asyncio.run(main())

loop方式调用

https://docs.python.org/zh-cn/3.10/library/asyncio-eventloop.html#asyncio.loop.run_until_complete

#低层以事件循环方式调用
loop.run_forever() #运行事件循环直到 stop() 被调用。
loop.run_until_complete(future)  #运行直到 future ( Future 的实例 ) 被完成

其它调用方式

#wait()  简单等待,在超时发生时不会取消可等待对象,3.11版更改了少用这个函数
task = asyncio.create_task(foo())
done, pending = await asyncio.wait()


try:    #等待对象完成,指定 timeout 秒数后超时
    await asyncio.wait_for(fun(), timeout=1.0) 
except asyncio.TimeoutError:
    print('timeout!') #如果发生超时,任务将取消并引发 asyncio.TimeoutError.


asyncio.as_completed(aws, *, timeout=None) #并发地运行可迭代对象中的 可等待对象。 返回一个协程的迭代器


跨线程调度
asyncio.run_coroutine_threadsafe(coro, loop) #向指定事件循环提交一个协程

常用函数

await asyncio.sleep(delay) #协程延时

asyncio.current_task(loop=None) #返回当前运行的 Task 实例,如果没有正在运行的任务则返回 None
asyncio.all_tasks(loop=None)   #返回事件循环所运行的未完成的 Task 对象的集合。

to_thread 在线程中运行

asyncio.to_thread(func, /, args, **kwargs) #在不同的线程中异步地运行函数 func
向此函数提供的任何
args 和 **kwargs 会被直接传给 func。 并且,当前 contextvars.Context 会被传播,允许在不同的线程中访问来自事件循环的上下文变量。



Futures

Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。



Task 对象

一个与 Future 类似 的对象,可运行 Python 协程。非线程安全
asyncio.Task 从 Future 继承了其除 Future.set_result() 和 Future.set_exception() 以外的所有 API。
https://docs.python.org/zh-cn/3.10/library/asyncio-task.html#task-object

asyncio.create_task() #创建 Task 对象 #也可用低层级的 loop.create_task()
*不建议手动实例化 Task 对象

cancel() 要取消一个正在运行的 Task 对象

cancelled() 可被用来检测 Task 对象是否被取消

done() 如果 Task 对象 已完成 则返回 True。

result() 返回 Task 的结果。
exception() 返回 Task 对象的异常。