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.hqwc.cn/news/415306.html

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

相关文章

视频号如何提取链接,新手怎么获取视频号链接!

视频号如何提取视频号链接,新手怎么获取视频号链接? 微信视频号是腾讯在2020年1月22日开启内侧的,视频号的视频链接在微信版本8.032中进行提及,也是微信在这个版本中增加的功能之一。 视频号链接怎么来的? 视频号链接…

Linux下进程子进程的退出情况

进程的退出分为了两大类,一类是正常的退出,另一类是非正常的退出。 正常退出时有五种情况,分别是 ①main函数调用return ②进程调用exit(),标准c库 ③进程调用_exit()或者_Exit(),属于系统调用 ④进程最后一个线程返回 ⑤最…

科普栏目|智能酒精壁炉 vs. 传统取暖:优势对比一目了然

随着科技的飞速发展,家居取暖方式也在逐渐朝着智能化、高效能源利用的方向迈进。在众多壁炉类型中,智能酒精壁炉以其独特的优势正成为现代家庭取暖的选择,下面将详细探讨智能酒精壁炉相较其他类型壁炉的卓越之处。 1.智能酒精壁炉采用酒精作为…

开发设计和迭代管理效率提升:PDManer元数建模

一、引言 在复杂多变的软件开发全生命周期中,数据库设计与建模扮演着举足轻重的角色。这一环节不仅关乎数据存储效率和应用性能优化,而且对于系统架构稳健性及业务逻辑清晰化具有深远影响。因此,选择一款功能强大且高效的数据库建模工具至关…

办公电脑监控软件推荐哪个 | 办公电脑监控软件价格

随着信息技术的不断发展,办公电脑监控软件已成为企业管理员工工作和保障信息安全的重要工具。 然而,市场上的办公电脑监控软件种类繁多,功能和价格也各不相同,让企业用户在选择时感到困惑。 一、办公电脑监控软件价格 办公电脑监…

FPC柔性化机器视觉缺陷检测

FPC(柔性电路板)在电子产品中扮演着至关重要的角色,其质量和可靠性直接影响到产品的性能和安全性。在FPC线路板加工过程中,由于制造工艺的复杂性,很容易产生各种缺陷,如焊锡不良、偏位、漏铜、短路等,因为有太多的环节…

2024年1月编程排行榜出炉!Python遥遥领先!

2024年1月TIOBE编程语言排行榜出炉啦!Python依然位于榜首,占比为13.97%。尽管本月有所下跌(2.39%),但它仍然是排名第一的编程语言。 2023年人工智能、AI崛起的趋势,Python的热度也一直遥遥领先。不止TIOBE编…

Android Launcher3各启动场景源码分析

文章目录 一、概述二、开机启动Launcher2.1、开机启动Launcher流程图2.2、开机启动流程源码分析 三、短压Home键启动Launcher3.1、短压Home键启动Launcher流程图3.2、短压Home键启动Launcher源码分析 四、Launcher异常崩溃后的自启动4.1、Launcher异常崩溃后的自启动流程图4.2、…

电力市场知识及市场出清电价(market clearing price)程序分享!

​Main-导览 一、电力市场概述 2000以前,国内并不存在电力市场,而是叫计划电力经济。发电侧为卖方,核算发电成本和利润上报国家,审核通过后就是上网电价。用户侧为买方,被动执行国家制定的分时电价。计划电力经济的优…

X-Bogus加密参数分析与jsvmp算法(仅供学习)

文章目录 1. 抓包分析2. X-Bogus参数分析 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫…

golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发…