Python高级编程之IO模型与协程

a1581da23341383d927587692b9d425f.jpeg

更多Python学习内容:ipengtao.com

在Python高级编程中,IO模型和协程是两个重要的概念,它们在处理输入输出以及异步编程方面发挥着关键作用。本文将介绍Python中的不同IO模型以及协程的概念、原理和用法,并提供丰富的示例代码来帮助大家深入理解这些主题。

IO模型

IO(Input/Output)模型是计算机系统中用于管理输入和输出的方式或模式。在Python中,有几种常见的IO模型,包括阻塞IO、非阻塞IO、多路复用IO和异步IO。

1 阻塞IO

阻塞IO是最常见的IO模型之一,它的特点是当程序发起IO操作(如读取文件或网络数据)时,程序会被阻塞,直到IO操作完成才会继续执行后续代码。阻塞IO模型的优点是简单易用,但缺点是在IO操作期间程序无法执行其他任务,效率较低。

以下是一个阻塞IO的示例,读取文件内容:

with open('example.txt', 'r') as file:data = file.read()# 在文件读取完成前,程序会被阻塞print(data)

2 非阻塞IO

非阻塞IO模型允许程序在等待IO操作完成时继续执行其他任务,而不会被阻塞。在Python中,可以使用selectpoll模块实现非阻塞IO。非阻塞IO的优点是可以提高程序的并发性,但需要手动轮询IO状态,编程复杂度较高。

以下是一个使用select模块的非阻塞IO示例,读取文件内容:

import selectwith open('example.txt', 'r') as file:# 设置文件为非阻塞模式file_fd = file.fileno()file.setblocking(False)ready_to_read, _, _ = select.select([file_fd], [], [], 0.1)if file_fd in ready_to_read:data = file.read()print(data)else:print("文件未就绪")

3 多路复用IO

多路复用IO模型允许程序同时监听多个IO操作的状态,当其中任何一个IO操作就绪时,程序可以立即进行处理,而不会被阻塞。在Python中,可以使用selectpollepoll(Linux特定)或kqueue(BSD特定)来实现多路复用IO。多路复用IO是实现高并发的关键。

以下是一个使用select模块的多路复用IO示例,同时监听多个文件:

import selectfiles = [open('file1.txt', 'r'), open('file2.txt', 'r')]while True:ready_to_read, _, _ = select.select(files, [], [], 0.1)for file in ready_to_read:data = file.read()print(data)

4 异步IO

异步IO模型允许程序在发起IO操作后继续执行其他任务,当IO操作完成时,系统会通知程序并回调指定的处理函数。Python中的异步IO通常使用asyncio库来实现,它基于协程(coroutine)模型。异步IO在处理大规模IO密集型任务时表现出色。

以下是一个使用asyncio库的异步IO示例,读取文件内容:

import asyncioasync def read_file(file_name):with open(file_name, 'r') as file:data = await file.read()print(data)async def main():task1 = read_file('file1.txt')task2 = read_file('file2.txt')await asyncio.gather(task1, task2)asyncio.run(main())

协程

协程是一种轻量级的线程,它允许程序在执行过程中暂停并恢复。在Python中,协程通常使用asyncawait关键字定义。协程可以用于异步编程,提高程序的并发性和响应性。

1 协程的定义与使用

以下是一个简单的协程示例:

import asyncioasync def hello():print("Hello")await asyncio.sleep(1)  # 模拟耗时操作print("World")asyncio.run(hello())

在上述示例中,hello函数是一个协程,使用await关键字来暂停协程的执行,等待一个异步操作完成。asyncio.run()函数用于运行协程。

2 协程与异步IO

协程通常与异步IO一起使用,以实现非阻塞的IO操作。使用asyncio库,可以轻松创建异步IO操作的协程。

以下是一个使用协程进行异步文件读取的示例:

import asyncioasync def read_file(file_name):with open(file_name, 'r') as file:data = await file.read()return dataasync def main():task1 = read_file('file1.txt')task2 = read_file('file2.txt')data1, data2 = await asyncio.gather(task1, task2)print(data1)print(data2)asyncio.run(main())

在上述示例中,创建了两个文件读取的协程任务,并使用asyncio.gather()函数并行执行这些任务。

异步编程的优势

异步编程和协程在处理IO密集型任务时具有明显的优势,包括:

  • 提高程序的并发性和响应性。

  • 允许在单个线程中管理多个IO操作,减少线程切换的开销。

  • 降低内存消耗,因为不需要为每个IO操作创建新的线程。

  • 更容易编写和维护,因为不需要手动管理线程和锁。

总结

本文介绍了Python中的不同IO模型(阻塞IO、非阻塞IO、多路复用IO和异步IO)以及协程的概念和用法。了解这些概念和技术对于高级编程和处理IO密集型任务非常重要。

异步编程和协程在现代应用程序中变得越来越重要,特别是在网络应用、Web开发和大规模数据处理中。通过合理选择合适的IO模型和充分利用协程,你可以编写高效、响应快的Python应用程序。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

48bd3082e0bf3de7f6b9cbe2018c9e36.png

点击“阅读原文”,获取更多学习内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOI与AVI:在视觉检测中的不同点和相似点

AOI(关注区域)和AVI(视觉感兴趣区域)是视觉检测中常用的两个概念,主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配,但它们在定义和实际应用等方面有一些差异。 AOI…

基于SpringBoot的社区帮扶对象管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Git教程学习:03 记录每次更新到仓库

文章目录 1 检查当前文件状态2 跟踪新文件3 暂存已修改的文件4 状态简览5 忽略文件6 查看已暂存和未暂存的修改7 提交更新8 跳过使用暂存区域9 移除文件10 移动文件 现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本。 通常…

前端和后端之间的CORS 跨域和解决办法

什么是CORS(Cross-Origin Resource Sharing,跨源资源共享) 跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源&#xff0…

Docker之安装Nginx

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。🎯&…

为什么 macOS 比 Windows 稳定?

在计算机操作系统领域,macOS 和 Windows 分别是苹果公司和微软公司的主打产品。尽管两者都拥有大量的用户群体,但在稳定性和用户体验方面,macOS 常常被认为优于 Windows。那么,为什么 macOS 比 Windows 更稳定呢? 我们…

算法题-爬楼梯-不同思路解法

主要记录个人思考过程,不同方案实现思路的演变 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:…

C++系列-第1章顺序结构-9-字符类型char

在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述字符类型char 字符类型char 在C编程语言中,char是一种基本的数据类型,它用于存储单个字符。字符可以是字母、数字、标点符号或者…

简单的推箱子游戏实战

目录 项目分析 地图初始化 背景图片 游戏场景图片: 热键控制 按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 项目分析 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 地图初始化 背景图片 #include <…

基于SkyEye仿真飞腾处理器:运行U-Boot并加载Phytium-FreeRTOS

仿真平台在帮助提升研发效率、加快产品面市时间上的作用已得到诸多验证&#xff0c;通过对处理器进行仿真来支持嵌入式系统及软件的虚拟化开发、测试和验证成为目前应用较为广泛的方法。天目全数字实时仿真软件SkyEye是一款基于可视化建模的硬件行为级仿真平台&#xff0c;在众…

leetcode:1736. 替换隐藏数字得到的最晚时间(python3解法)

难度&#xff1a;简单 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 …

selenium处理下拉框

当想要爬取的数据由下拉框来选择时&#xff0c;应该如何处理&#xff1f; 页面如下&#xff1a; 目的获得电影的详细信息&#xff0c;包括票房&#xff0c;上映日期等。 代码如下&#xff1a; from selenium import webdriver from selenium.webdriver.support.select impor…

C语言——大头记单词

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一发奋努力的背后&#xff0c;必有加…

Ubuntu18.04在线镜像仓库配置

在线镜像仓库 1、查操作系统版本 rootubuntu:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 2、原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3、查…

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

零售EDI:Babylist EDI 项目案例

Babylist 与各种不同的品牌和零售商合作&#xff0c;包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品&#xff0c;并根据自己的需求和喜好选择适合的项目。本文将为大家介绍对接Babylist 的EDI项目案例。 Babylist EDI 需求 传输协…

linux文件比较工具diff-关于参数-pN的设置方法

非纯文本文件比较可用cmp命令 第一&#xff1a;利用diff创建分析文件&#xff0c;处理补丁&#xff08;patch&#xff09;功能的文件 案例&#xff1a;多数用于同一软件的不同版本之间&#xff0c;比如比较配置文件和源文件的区别&#xff0c;生成补丁文件&#xff0c;执行更…

Midjourney网页版

引言 基于国外的api开发开发了一款网页版的midjourney&#xff0c;文末有链接 相关资源 Midjourney官方教学资料Midjourney官网discord官网B站学习资源推荐 账号注册 获取网络访问权限 使用Midjourney的前提是计算机有外网访问权限 此处推荐两款软件,lantern的优势是免费&…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

LLM之LangChain(二)| LangChain中的Agent

在本文中&#xff0c;我们将讨论LangChain中的Agent及其各种类型。但在深入研究Agent之前&#xff0c;让我们先了解一下什么是LangChain和Agent。 一、什么是LangChain&#xff1f; LangChain是一种功能强大的自动化工具&#xff0c;可用于各种任务&#xff0c;它提供了可用于…