asyncio
是 Python 标准库中的一个模块,用于支持异步编程。它提供了实现协程、事件循环、任务、异步 I/O 等功能的工具,允许你编写非阻塞的代码,从而提高程序的并发性能。
asyncio
的核心概念
-
事件循环(Event Loop):
事件循环是asyncio
的核心,它负责调度和执行协程、处理 I/O 操作和管理任务。事件循环不断循环,检查是否有待处理的任务,并将它们提交给相应的处理程序。 -
协程(Coroutine):
协程是asyncio
提供的主要异步编程构建块。协程是使用async def
定义的异步函数,它可以在执行过程中挂起并在以后恢复,从而实现非阻塞的 I/O 操作。 -
任务(Task):
任务是对协程的封装,允许协程在事件循环中调度和执行。任务对象可以用来检查协程的状态、获取结果或处理异常。 -
Future:
Future 对象表示一个尚未完成的结果。它通常用于异步操作的结果返回。asyncio.Future
是一个低级别的构建块,用于实现协程和任务。
常用 API
以下是一些常用的 asyncio
API 和它们的用途:
-
asyncio.run(coro)
:
运行协程coro
,并阻塞直到协程完成。它会自动创建和关闭事件循环。import asyncio async def say_hello(): print("Hello") asyncio.run(say_hello())
-
asyncio.create_task(coro)
:
创建一个 Task 对象,将协程coro
调度到事件循环中执行。import asyncio async def say_hello(): print("Hello") async def main(): task = asyncio.create_task(say_hello()) await task asyncio.run(main())
-
asyncio.sleep(delay)
:
挂起协程delay
秒。用于模拟 I/O 操作的延时。import asyncio async def main(): print("Start") await asyncio.sleep(2) print("End") asyncio.run(main())
-
asyncio.gather(*tasks)
:
并发执行多个协程,返回它们的结果。适用于需要并行执行多个异步操作的场景。import asyncio async def task1(): await asyncio.sleep(1) return "Task 1" async def task2(): await asyncio.sleep(2) return "Task 2" async def main(): results = await asyncio.gather(task1(), task2()) print(results) asyncio.run(main())
-
asyncio.wait(tasks)
:
等待一组任务完成,可以选择是否等待所有任务完成或仅等待第一个完成。适用于需要等待多个任务完成的场景。import asyncio async def task1(): await asyncio.sleep(2) return "Task 1" async def task2(): await asyncio.sleep(1) return "Task 2" async def main(): tasks = [task1(), task2()] done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) for task in done: print(await task) asyncio.run(main())
-
asyncio.Event()
:
创建一个事件对象,用于协调协程间的同步。import asyncio async def wait_for_event(event): print("Waiting for event") await event.wait() print("Event occurred") async def trigger_event(event): await asyncio.sleep(1) event.set() async def main(): event = asyncio.Event() await asyncio.gather(wait_for_event(event), trigger_event(event)) asyncio.run(main())
-
asyncio.Queue
:
异步队列,允许在协程间安全地传递数据。import asyncio async def producer(queue): for i in range(5): await queue.put(i) await asyncio.sleep(1) async def consumer(queue): while True: item = await queue.get() if item is None: break print(f"Consumed: {item}") async def main(): queue = asyncio.Queue() await asyncio.gather(producer(queue), consumer(queue)) asyncio.run(main())
使用场景
- 网络 I/O:处理大量的网络请求时,使用
asyncio
可以避免阻塞,提高程序的并发性能。 - 文件 I/O:异步读取和写入文件,提高文件操作的效率。
- 后台任务:在后台运行异步任务,如定时任务、长时间运行的操作等。
- 并发执行:需要同时执行多个异步操作时,使用
asyncio.gather
等方法来并发处理。
总结
asyncio
是 Python 的一个强大模块,用于编写异步代码,实现高效的并发操作。通过使用事件循环、协程和任务,你可以在不阻塞主线程的情况下处理 I/O 操作和其他异步任务,从而提高应用的性能和响应速度。