当前位置:首页 > 编程技术 > 正文内容

Python 中的异步编程与 asyncio 库的实践

yc8889个月前 (02-14)编程技术138

Python 中的异步编程与 asyncio 库的实践

在 Python 编程中,处理高并发和 I/O 密集型任务时,异步编程是一种能够显著提升程序性能的关键技术。本文将深入探讨 Python 中异步编程的概念,并以内置的 asyncio 库为例,展示如何利用其特性构建高效、非阻塞的应用程序。

一、异步编程简介

异步编程允许程序在等待 I/O 操作(如网络请求、文件读写)完成时不被阻塞,而是转而去执行其他任务,从而提高系统的吞吐量和响应速度。这种模式下,Python 程序能够同时管理多个协程(coroutine),并在它们之间进行切换,而无需多线程或多进程带来的复杂性。

二、asyncio 库基础

asyncio 是 Python 3.4 及更高版本引入的标准库,它提供了一套完整的异步I/O框架,支持协程、事件循环、未来(Future)、任务(Task)以及多种异步I/O操作原语。

  1. 协程(Coroutine): 使用 async def 关键字定义的函数会返回一个协程对象,通过 await 关键字可以暂停协程的执行并等待另一个协程的结果。

Python1async def fetch_data(url):2    response = await fetch_url(url)  # 假设fetch_url是一个异步HTTP请求函数3    data = await process_response(response)4    return data
  1. 事件循环(Event Loop): 异步操作的核心是事件循环,它负责调度协程的执行,监控 Futures 和 Tasks 的状态变化,并在合适的时机切换上下文。

Python1import asyncio23loop = asyncio.get_event_loop()4tasks = [asyncio.ensure_future(fetch_data(url)) for url in urls]5results = loop.run_until_complete(asyncio.gather(*tasks))6loop.close()
  1. Future 和 Task: Future 表示将来某个时刻可能完成的操作结果;Task 是 Future 的封装,增加了协程的调度功能。

  2. 异步上下文管理器与同步API桥接asyncio 提供了 async with 语法用于异步上下文管理,并通过 run_in_executor 方法将同步阻塞操作放入线程池执行,确保不会阻塞事件循环。

三、实战应用

在实际项目中,我们可以使用 asyncio 处理大量并发网络请求,或者优化涉及磁盘 I/O 的操作:

Python1import aiohttp  # 异步HTTP客户端库23async def main():4    async with aiohttp.ClientSession() as session:5        tasks = []6        for i in range(10):7            tasks.append(asyncio.create_task(fetch_page(session, f'http://example.com/page_{i}')))8        9        pages = await asyncio.gather(*tasks)10        for page in pages:11            print(f'Fetched page: {page}')1213async def fetch_page(session, url):14    async with session.get(url) as response:15        return await response.text()1617# 运行主协程18asyncio.run(main())

通过本文对 Python 异步编程及 asyncio 库的介绍,开发者可以更好地理解如何借助这一强大工具来解决实际开发中的性能瓶颈问题,实现更高效的应用程序设计。随着更多第三方库对异步特性的支持,asyncio 在现代 Python 开发中扮演着愈发重要的角色。


本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/11003.html

分享给朋友:

“Python 中的异步编程与 asyncio 库的实践” 的相关文章

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

今天在安装MySQL时出现starting the server失败,经过查询分析得出以下结论,记录一下操作步骤。原因分析:如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。star...

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状;该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线。下面,通过C#程序代码介绍如何...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...