python的asyncio使用介绍

2025-11-03 23:59:00
admin
原创 250
摘要:python的asyncio使用介绍

一、python的asyncio使用介绍

1、官方帮助:https://docs.python.org/zh-cn/3/library/asyncio-task.html

2、官方帮助:https://docs.python.org/zh-cn/3/library/asyncio-runner.html

3、官方帮助https://docs.python.org/zh-cn/3/library/asyncio-eventloop.html

4、asyncio是标准库的一个模块,用于编写异步IO操作的代码;

5、async定义协程函数,调用时生成协程对象,协程在执行过程中可以暂停

6、await作用于可等待对象,可等待对象包含协程、Task、Future,Task是Future子类;

7、await作用于协程,直接执行协程,await作用于Task或Future,等待Task或Future执行完成;

8、asyncio.run(coroutine),启动一个事件循环,协程包装成一个任务,然后放入事件循环,此任务完成时关闭事件循环;

9、事件循环包含两个队列:_ready就绪任务队列,任务可以马上执行,_scheduled延迟任务队列,任务在指定时间后执行;


协程运行:

1、asyncio.run(coroutine),运行最高级的入口协程;

2、await coroutine,在协程里面直接调用其他协程;

3、asyncio.create_task(coroutine),并发运行作为任务的多个协程;

4、asyncio.TaskGroup().create_task(coroutine),并发运行作为任务的多个协程;


工具函数:

1、coroutines.iscoroutinefunction(func),是否协程函数,async关键字定义;

2、coroutines.iscoroutine(obj),是否协程对象,调用协程函数时生成;


常用函数:

1、asyncio.sleep(seconds),在事件循环中插入一个延迟任务,然后等待延迟任务完成;

2、asyncio.timeout(seconds),参数是相对时间,生成一个异步上下文管理器,通过async with管理业务处理时间;

3、asyncio.timeout_at(when),参数是绝对时间,生成一个异步上下文管理器,通过async with管理业务处理时间;

4、asyncio.wait_for(coroutine,seconds),内部实际调用asyncio.timeout(seconds),用于简化代码编写;

5、超时上下文管理器是一个Timeout对象,__aenter__生成一个延迟任务,业务未在期限内完成则取消业务;

6、Timeout.__aexit__包含两种情况,业务正常完成时取消延迟任务,否则转换CancelledError为TimeoutError;

7、asyncio.gather(*aws,return_exceptions=False),并发运行多个协程,然后等待所有任务完成;

8、return_exceptions=False,其中一个任务抛出异常,直接传播异常到调用位置,其余任务继续运行;

9、return_exceptions=True,其中一个任务抛出异常,异常会和成功的结果一样处理,聚合至结果列表;

10、asyncio.get_running_loop(),返回线程正在运行的事件循环,如果没有则返回RuntimeError;

11、asyncio.current_task(),返回正在运行的任务,如果没有则返回None;

12、asyncio.all_tasks(),返回所有未完成任务的集合;


二、python的asyncio使用详解:

1、协程和任务必须在事件循环中运行,否则会抛出异常RuntimeError;

2、事件循环只保留任务的弱引用,未在其他地方被引用的任务可能被垃圾回收;

3、asyncio.TaskGroup保留所有创建任务的强引用,任务组销毁时等待所有任务完成;

4、asyncio.TaskGroup只要其中一个任务抛出异常,则取消任务组中的所有其他任务;

5、协程里面,用户主动抛出异常,会被放进ExceptionGroup,需要使用except*捕获


任务强引用:

taskSet = set()
taskSet.add(task)
task.add_done_callback(taskSet.discard)


任务回调:

1、Future.add_done_callback(callback),添加一个回调到回调列表中;

2、Future.done(),成功或失败都算完成,所有回调被放入事件循环;

3、Future.done(),await future的任务重新被放入事件循序;

4、事件循环中包含任务和回调,按照他们进入队列的顺序,依次执行;

5、执行任务时,任务包含一个协程,可以让渡线程,asyncio.current_task()!=None;

6、执行回调时,回调是一个普通函数,不能让渡线程,asyncio.current_task()=None;

7、回调示例:asyncio_callback_demo.py


回调示例输出:

some: <Task pending name='Task-2' coro=myCoro() running>
some: 1
some: <Task pending name='Task-3' coro=myCoro() running>
some: 1
call: None
call: <Task finished name='Task-2' coro=myCoro() done>
finish main
call: None
call: <Task finished name='Task-3' coro=myCoro() done>

发表评论
评论通过审核之后才会显示。