Python 中的异步编程:Asyncio

Python 的 asyncio 库提供了一个用于异步编程的框架,允许开发者通过协程实现并发操作,提高程序执行效率。它支持事件循环、任务调度和异步I/O操作,适用于编写高性能的网络应用和I/O密集型服务。

Python中的异步编程是一种编程模式,它允许程序在等待某些操作完成时继续执行其他任务,Asyncio是Python中的一个库,用于编写并发代码,使用async/await语法。

Python 中的异步编程:Asyncio
(图片来源网络,侵删)

以下是关于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。

Python 中的异步编程:Asyncio
(图片来源网络,侵删)
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 库的一些关键概念:

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 当一个操作等待超时时抛出的异常。

请注意,这个介绍只提供了一个快速概览,每个概念在异步编程中都有其详细的用法和重要性。