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

news2024/11/17 20:37:56

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 select

with 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 select

files = [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 asyncio

async 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 asyncio

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

asyncio.run(hello())

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

2 协程与异步IO

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

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

import asyncio

async def read_file(file_name):
    with open(file_name, 'r') as file:
        data = await file.read()
        return data

async 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.coloradmin.cn/o/1396660.html

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

相关文章

go语言(七)----slice的声明方式

1、声明方式一 //声明一个slice1是一个切片,但是并没有给slice分配空间var slice1 []intslice1 make([]int,3)2、声明方式二 声明一个slice切片,同时给slice分配空间,3个空间,初始化值是0var slice1 []int make([]int,3)3、声…

ChatGPT 报错“Oops!We ran into an issue while signing you in…”如何解决?

ChatGPT报错:“Oops!We ran into an issue while signing you in, please take abreak and try again soon.” 说明:哎呀!我们在登录时遇到了一个问题,请稍作休息并尽快再试一次。 原因: 看到这个提示时&a…

杂记 | 在Linux上使用Docker-compose安装单机版Milvus向量数据库并配置访问控制和可视化面板(Attu)

文章目录 01 Milvus向量数据库简介02 安装前的准备03 安装3.1 创建milvus工作目录3.2 下载并编辑docker-compose.yml3.3 下载milvus.yml文件3.4 启动milvus 04 访问可视化面板并修改密码 01 Milvus向量数据库简介 Milvus是一款开源的向量数据库,它专为AI应用设计&a…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日,市场监管总局(国家标准委)批准发布一批重要国家标准,涉及生产生活、绿色可持续等多个领域,这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

msvcr100.dll缺失的6种详细有效解决方法

msvcr100.dll究竟是什么文件?为什么会丢失?丢失后会对计算机产生什么影响?本文将详细介绍msvcr100.dll的定义、作用和影响,并给出6个解决msvcr100.dll丢失的方法。 一、msvcr100.dll是什么文件? msvcr100.dll是Micro…

跑通 yolov5-7.0 项目之训练自己的数据集

yolov5 一、yolov5 源码下载二、配置环境,跑通项目三、训练自己的数据集1、获取验证码数据2、标注图片,准备数据集3、开始训练自己的数据集1、train.py 训练数据集2、val.py 验证测试你的模型3、detect.py 正式用你的模型 四、遇到的报错、踩坑1、import…

MySQL的基本查询(附案例)

目录 前言 Create(创建) 单行数据全列插入: 多行数据指定列插入: 插入否则更新: 替换: Retrieve(读取) SELECT 列: 全列查询: 指定列查询&#xff1a…

DETR 个人理解

DETR 个人理解 目录 DETR 个人理解 概念说明 transformer网络结构 整体流程 损失计算 整体理解 结果说明 论文 代码 参考链接 个人拙见,仅供参考,欢迎指正交流 这篇论文还是挺重要的,因为是transforms用于目标检测的第一篇论文&am…

LiveGBS流媒体平台GB/T28181常见问题-多个网段如何注册LiveGBS多网段设备收流多个专线不同地址网段收流内外网同时收流

LiveGBS常见问题多个网段如何注册LiveGBS多网段设备收流多个专线不同地址网段收流内外网同时收流 1、背景2、设备接入播放2.1、查看通道2.2、直播播放 3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台 1、背景 服务器部署的时候,可能有多个…

VIM工程的编译 / VI的快捷键记录

文章目录 VIM工程的编译 / VI的快捷键记录概述笔记工程的编译工程的编译 - 命令行vim工程的编译 - GUI版vim备注VIM的帮助文件位置VIM官方教程vim 常用快捷键启动vi时, 指定要编辑哪个文件正常模式光标的移动退出不保存 退出保存只保存不退出另存到指定文件移动到行首移动到行尾…

cmseasy业务逻辑漏洞

这个cmseasy靶场似乎感觉有点意思? 1.任意修改用户密码 首先肯定先是注册一个账号(账号test,密码admin),去找到他的找回密码这里 随便填点数字(这个用户名与他的邮箱还是要对应的)&#…

基于Springboot+vue鲜花商城系统(前后端分离)

该项目完全免费 项目技术栈: 前端:vueelementUIecharts 后端:SpringbootmybatisMySQL 项目主要功能: 商品信息 商品分类 角色管理 公告管理 轮播图管理 订单管理 收货地址管理 日志管理 部分功能截图:

GaussDB与openGauss有什么相同和不同?

众所周知,GaussDB是华为自主创新研发的分布式关系型数据库,为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务,openGauss是开源数据库,两者之间又是什么样的关系,有什么相同和不同,让我…

【unity学习笔记】语音驱动blendershape

1.导入插件 https://assetstore.unity.com/packages/tools/animation/salsa-lipsync-suite-148442 1.选择小人,点击添加组件 分别加入组件: SALSA EmoteR Eyes Queue Processor(必须加此脚本):控制前三个组件的脚本。…

Win10下在Qt项目中配置SQlite3环境

资源下载 官网资源:SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def,sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…

2024年香港优才计划新政策变化!看清利弊再做申请!

2024年香港优才计划新政策变化!看清利弊再做申请! 2024年香港优才计划申请新政策变化如下: 变化一:高管加分条件更明确,但条件更严 以前:默认自己在公司处于中高层管理岗,给自己加高管分。 现在…

【我与Java的成长记】之多态,重载与重写详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言一、多态的概…

前端面试题(持续更新~~)

文章目录 一、基础1、数组常用的方法2、数组有哪几种循环方式?分别有什么作用?3、字符串常用的方法4、原型链5、闭包6、常见的继承7、cookie 、localstorage 、 sessionstrorage区别8、数组去重方法9、http 的请求方式10、数据类型的判断方法11、cookie …

基于改进蝙蝠算法的三维航线规划算法

matlab2020a可正常运行 基于改进蝙蝠算法的三维航线规划资源-CSDN文库

Java 8 简化代码(2)

Stream 操作详解 为了方便你理解 Stream 的各种操作,以及后面的案例,我先把这节课涉及的 Stream 操作汇总到了一张图中。你可以先熟悉一下。 在接下来的讲述中,我会围绕订单场景,给出如何使用 Stream 的各种 API 完成订单的统计、…