Python中的异步编程是一种编程模式,它允许程序在等待某些操作完成时继续执行其他任务,Asyncio是Python中的一个库,用于编写并发代码,使用async/await语法。
以下是关于Python中异步编程的一些重要概念和用法:
1、协程(Coroutines)
协程是一种可以暂停和恢复执行的函数,它们使用async def定义,并使用await关键字来调用其他协程或异步操作。
import asyncio async def my_coroutine(): print("Hello") await asyncio.sleep(1) print("World") async def main(): await my_coroutine() asyncio.run(main())
2、事件循环(Event Loop)
事件循环是异步编程的核心组件,它负责调度和执行协程,可以使用asyncio.get_event_loop()获取当前事件循环,或者使用asyncio.run()自动创建一个新的事件循环。
import asyncio async def my_coroutine(): print("Hello") await asyncio.sleep(1) print("World") loop = asyncio.get_event_loop() loop.run_until_complete(my_coroutine()) loop.close()
3、Futures 和 Tasks
Futures 和 Tasks 是异步编程中用于表示尚未完成的计算结果的对象,Tasks 是一种特殊的Futures,它们包装协程并在事件循环中执行,可以使用asyncio.ensure_future()将协程转换为Task,或者使用asyncio.create_task()直接创建Task。
import asyncio async def my_coroutine(): print("Hello") await asyncio.sleep(1) print("World") async def main(): task = asyncio.create_task(my_coroutine()) await task asyncio.run(main())
4、并发和并行
并发是指同时执行多个任务,但不一定在同一时刻执行,并行是指同时执行多个任务,并且在同一时刻执行,在Python中,可以使用asyncio库实现并发和部分并行。
import asyncio async def my_coroutine(n): print(f"Start {n}") await asyncio.sleep(1) print(f"End {n}") async def main(): tasks = [asyncio.create_task(my_coroutine(i)) for i in range(5)] await asyncio.gather(*tasks) asyncio.run(main())
5、异步I/O操作
异步I/O操作是指在等待I/O操作完成时不阻塞程序执行的操作,Python中的asyncio库提供了许多异步I/O操作,如异步文件读写、异步网络请求等。
import asyncio async def read_file(): async with aiofiles.open("file.txt", mode="r") as f: content = await f.read() print(content) async def main(): await read_file() asyncio.run(main())
Python中的异步编程可以帮助我们编写高效、可扩展的并发代码,通过使用asyncio库和协程,我们可以更好地利用多核CPU和I/O资源,提高程序的性能。
下面是一个简单的介绍,概述了 Python 中 Asyncio 库的一些关键概念:
概念/组件 | 描述 |
async | 关键字,用于定义异步函数,异步函数是可以通过await 表达式暂停执行的函数。 |
await | 表达式用于挂起异步函数的执行,直到等待的对象准备好,它只能在异步函数内部使用。 |
async for | 在异步迭代中使用,允许异步迭代一个异步可迭代对象。 |
async with | 在异步上下文管理器中使用,允许在异步代码中使用with 语句。 |
Event Loop | 事件循环是 asyncio 的核心,负责调用准备好的异步任务,并在任务等待时处理其他事件。 |
Future | 代表尚未完成的计算结果的代理对象,我们不会直接创建 Future 对象,而是通过await 表达式与它们交互。 |
Task | 是基于 Future 的对象,用于并发地调度和运行协程,通过asyncio.create_task() 创建。 |
Coroutine | 协程是一个通过async 定义的函数,它可以通过await 表达式暂停和恢复执行。 |
asyncio.run() | 在 Python 3.7+ 中引入,用于运行最高层级的入口点协程。 |
asyncio.gather() | 并发运行多个协程,并等待它们全部完成。 |
asyncio.shield() | 防止一个协程被取消,如果被shield 保护的协程被取消,不会传播到它的父协程。 |
asyncio.sleep() | 异步版本的time.sleep() ,它不会阻塞事件循环。 |
asyncio.Lock() | 一个异步的互斥锁,用于防止多个协程同时访问共享资源。 |
asyncio.Queue | 异步队列,允许在协程之间安全地传输数据。 |
asyncio.create_task() | 创建一个 Task 对象,用于并发地调度协程。 |
asyncio.CancelledError | 当一个任务被取消时抛出的异常。 |
asyncio.TimeoutError | 当一个操作等待超时时抛出的异常。 |
请注意,这个介绍只提供了一个快速概览,每个概念在异步编程中都有其详细的用法和重要性。