深入理解 Python 中的异步操作:async 和 await

简介: Python 的异步编程通过 `async` 和 `await` 关键字处理 I/O 密集型任务,如网络请求和文件读写,显著提高性能。`async` 定义异步函数,返回 awaitable 对象;`await` 用于等待这些对象完成。本文介绍异步编程基础、`async` 和 `await` 的用法、常见模式(并发任务、异常处理、异步上下文管理器)及实战案例(如使用 aiohttp 进行异步网络请求),帮助你高效利用系统资源并提升程序性能。

在 Python 编程中,异步操作是处理 I/O 密集型任务(如网络请求、文件读写等)的一种高效方式。通过异步操作,程序可以在等待 I/O 操作完成的同时执行其他任务,从而显著提高整体性能。Python 3.5 引入了 async 和 await 关键字,使得编写异步代码变得更加直观和简洁。本文将带你深入理解这两个关键字,并通过代码和案例展示其用法。
站大爷代理IP工具的验证功能介绍 (9).png

一、异步编程基础
在深入 async 和 await 之前,我们先来了解一下异步编程的基本概念。

  1. 同步与异步
    同步:任务按顺序执行,一个任务完成后才执行下一个任务。
    异步:任务可以并发执行,不必等待一个任务完成后再执行下一个任务。
  2. 异步编程的优势
    提高性能:在等待 I/O 操作(如网络请求)时,可以执行其他任务。
    资源利用:更有效地利用系统资源,避免阻塞。
  3. 异步编程的难点
    代码复杂度:异步代码通常比同步代码更难理解和调试。
    错误处理:需要特别注意异步操作中的错误处理。
    二、async 和 await 简介
  4. async 关键字
    async 关键字用于定义一个异步函数。异步函数在调用时不会立即执行,而是返回一个 awaitable 对象(通常是 Asyncio 协程)。

  5. await 关键字
    await 关键字用于等待一个 awaitable 对象完成。它只能在 async 函数内部使用。当 await 一个异步函数时,当前协程会暂停执行,直到被等待的异步函数完成,然后恢复执行。

三、async 和 await 的用法

  1. 异步函数的定义
    使用 async 关键字定义一个异步函数:

async def my_async_function():

# 异步代码
pass
  1. 调用异步函数
    异步函数在调用时不会立即执行,而是返回一个 awaitable 对象。要等待异步函数完成,可以使用 await 关键字(通常在另一个异步函数内部):

import asyncio

async def main():
result = await my_async_function()
print(result)

注意:不能直接调用 main(),需要使用事件循环来运行它

asyncio.run(main())

  1. 异步函数中的 await
    在异步函数内部,可以使用 await 等待其他异步函数或异步操作完成:

import asyncio

async def fetch_data_from_api():

# 模拟网络请求
await asyncio.sleep(1)  # 异步等待 1 秒
return "Data from API"

async def main():
data = await fetch_data_from_api()
print(data)

asyncio.run(main())

四、异步编程中的常见模式

  1. 并发执行多个异步任务
    使用 asyncio.gather() 可以并发执行多个异步任务:

import asyncio

async def task1():
await asyncio.sleep(1)
return "Task 1 complete"

async def task2():
await asyncio.sleep(2)
return "Task 2 complete"

async def main():
results = await asyncio.gather(task1(), task2())
print(results)

asyncio.run(main())

在这个例子中,task1 和 task2 会并发执行,而不是按顺序执行。

  1. 异常处理
    在异步函数中,可以使用 try...except 语句来处理异常:

import asyncio

async def faulty_task():
await asyncio.sleep(1)
raise ValueError("An error occurred")

async def main():
try:
await faulty_task()
except ValueError as e:
print(f"Caught an exception: {e}")

asyncio.run(main())

  1. 异步上下文管理器
    Python 3.7 引入了异步上下文管理器,允许在异步代码中使用 async with 语句:

import asyncio

class AsyncContextManager:
async def aenter(self):
print("Entering context")
return self

async def __aexit__(self, exc_type, exc_val, exc_tb):
    print("Exiting context")

async def main():
async with AsyncContextManager() as ctx:
await asyncio.sleep(1)
print("Inside context")

asyncio.run(main())

五、实战案例:异步网络请求
下面是一个使用 aiohttp 库进行异步网络请求的示例。aiohttp 是一个支持异步 I/O 的 HTTP 客户端/服务器库。

  1. 安装 aiohttp
    首先,需要安装 aiohttp 库:

pip install aiohttp

  1. 异步网络请求示例
    import aiohttp
    import asyncio

async def fetch(session, url):
async with session.get(url) as response:
return await response.text()

async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://example.com')
print(html[:100]) # 打印前 100 个字符

asyncio.run(main())

在这个例子中,我们使用 aiohttp.ClientSession() 创建一个会话对象,并使用 await session.get(url) 发送异步 GET 请求。然后,我们使用 await response.text() 获取响应的文本内容。

六、总结
async 和 await 是 Python 中处理异步操作的关键字,它们使得编写异步代码变得更加直观和简洁。通过异步编程,我们可以更有效地利用系统资源,提高程序的性能。本文介绍了 async 和 await 的基本概念、用法以及异步编程中的常见模式,并通过实战案例展示了如何使用它们进行异步网络请求。希望这些内容能帮助你更好地理解和使用 Python 中的异步操作。

目录
相关文章
|
3月前
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
在Python的并发编程世界中,没有万能的解决方案,只有最适合特定场景的方法。希望本文能够为你拨开迷雾,找到那条通往高效并发编程的光明大道。
48 2
|
4月前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
56 4
|
2天前
|
SQL 网络协议 安全
Python异步: 什么时候使用异步?
Asyncio 是 Python 中用于异步编程的库,适用于协程、非阻塞 I/O 和异步任务。使用 Asyncio 的原因包括:1) 使用协程实现轻量级并发;2) 采用异步编程范式提高效率;3) 实现非阻塞 I/O 提升 I/O 密集型应用性能。然而,Asyncio 并不适合所有场景,特别是在 CPU 密集型任务或已有线程/进程方案的情况下。选择 Asyncio 应基于项目需求和技术优势。
|
1月前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
44 3
|
3月前
|
关系型数据库 MySQL 数据处理
探索Python中的异步编程:从asyncio到异步数据库操作
在这个快节奏的技术世界里,效率和性能是关键。本文将带你深入Python的异步编程世界,从基础的asyncio库开始,逐步探索到异步数据库操作的高级应用。我们将一起揭开异步编程的神秘面纱,探索它如何帮助我们提升应用程序的性能和响应速度。
|
3月前
|
调度 Python
深入理解 Python 中的异步操作 | python小知识
在现代编程中,异步操作是一个非常重要的概念,尤其是在处理 I/O 密集型任务时。使用异步操作可以显著提高程序的性能和响应速度。Python 提供了 `async` 和 `await` 关键字,使得编写异步代码变得更加直观和简洁【10月更文挑战第8天】
43 2
|
3月前
|
数据采集 前端开发 NoSQL
Python编程异步爬虫实战案例
Python编程异步爬虫实战案例
84 2
|
2月前
|
NoSQL 关系型数据库 MySQL
python协程+异步总结!
本文介绍了Python中的协程、asyncio模块以及异步编程的相关知识。首先解释了协程的概念和实现方法,包括greenlet、yield关键字、asyncio装饰器和async/await关键字。接着详细讲解了协程的意义和应用场景,如提高IO密集型任务的性能。文章还介绍了事件循环、Task对象、Future对象等核心概念,并提供了多个实战案例,包括异步Redis、MySQL操作、FastAPI框架和异步爬虫。最后提到了uvloop作为asyncio的高性能替代方案。通过这些内容,读者可以全面了解和掌握Python中的异步编程技术。
52 0
|
3月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
33 3
|
4月前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
在快速发展的Web开发领域,高性能与高效响应是衡量应用质量的重要标准。随着Python在Web开发中的广泛应用,如何利用Python的协程(Coroutine)与异步函数(Async Functions)特性来优化Web应用的性能,成为了许多开发者关注的焦点。本文将从实战角度出发,通过具体案例展示如何运用这些技术来提升Web应用的响应速度和吞吐量。
38 1