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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SyntaxError: invalid syntax. Perhaps you forgot a comma?解决办法

Bug分析 1.错误解释2. 示例 1.错误解释 这个错误提示“SyntaxError: invalid syntax. Perhaps you forgot a comma?”表明你的代码中存在语法错误,可能是缺少了一个逗号。 在Python中,逗号用于分隔列表、元组和字典中的元素。如果在创建这些数据结构时…

使用dataframe_image将dataframe表格转为图片

安装方法:pip install dataframe-image 这个库可以将dataframe的表格转换为图片格式,比起数字,图片的格式在手机上会更清晰的看清楚数据及对应行列 示例程序 import numpy as np import pandas as pd import dataframe_imagedef main():my…

OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换[一]

前言 在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用,帮助读者更好地理解这一概念。 一、OPC UA的定义 OPC UA全称为“开放性生产控制和统一…

Spring基础属性一览:注释、对象装配、作用域、生命周期

在Spring中想要更简单的存储和读取对象的核心是使用注解,也就是我们接下来要学的Spring中相关注解。 之前我们存储Bean时,需要在自己添加的配置文件中添加一行bean才行: 而现在我们只需要一个注解就可以替代之前要写的一行配置的繁琐了。 …

基于域账户及西门子simatic logon的集中权限管理的实现(二)

上次我们完成了域环境及simatic logon服务器的搭建,今天我们将在wincc及HMI上进行组态,实现用域账户进行登录。 3.WINCC用户管理组态引文:博途工控人平时在哪里技术交流博途工控人社群 3.1 首先将要安装WINCC的服务器加入域。 3.2 在wincc…

springboot实现黑名单和白名单功能

题外话 关于黑名单和白名单功能,我觉得可以直接用linux服务器的iptables或nftables来实现黑名单和白名单功能。这两个工具都是Linux系统上用于配置防火墙规则的命令行工具。 iptables: 描述: iptables 是一个用于配置IPv4数据包过滤规则的工具…

Netty开篇——NIO章中(四)

通道(Channel) Channel类似于流,有些区别 同时进行读写,而流只能读或者只能写实现异步读写数据可以从缓冲读数据,也可以写数据到缓冲 Channel在 NIO 中是一个接口:public interface Channel extends Closeable{} 常用的Channel类有:FileChan…

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

Arthas项目实战用法

一、简介 1、项目所在位置 2、安装Arthas 1. 下载arthas-boot.jar 2. 运行arthas-boot.jar 3. 选择进程 3、卸载Arthas 二、核心监视功能 1、monitor:监控方法的执行情况 2、watch:检测函数返回值 3、trace:根据路径追踪,…

低代码自动化测试的实践

何为低代码测试 传统上,功能、 UI、端到端等测试自动化的实现都涉及编写测试脚本,代替测试人员执行重复的手动测试任务。自动化脚本的开发工作通常由 QA 工程师或开发人员完成,这需要编写大量代码。 而低代码甚至无代码的理念也是在自动化测…

海外盲盒系统搭建:盲盒出海成为了盲盒企业的新机遇

盲盒在我国作为一个新型的消费模式,取得了较大的成功,也成为了当下流行的潮玩文化。盲盒在国内爆火的优势下,也为我国盲盒出海提供了市场基础。当下,海外市场具有较大的发展潜力,除此之外,盲盒出海也成为当…

transformer详解

transformer 框架注意力机制注意力评分函数(scoring function)自注意力机制(self-attention)masked self-attention多头注意力(multi-head attention) 位置编码Layer normalizationResnet(Add) 框架 框架解…

使用AI自动生成PPT提高制作效率

使用AI自动生成PPT提高制作效率 在制作PPT方面,很多制作者都会轻易跳进一个怪圈:“我要制作一个关于关爱老人的PPT,该怎么做呢,有模板没有?”这个会涉及很多逻辑需要经过不断的思考,制作PPT要通过很多素材、使用技巧、…

【报错】检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败错误

情况描述 在使用C#进行工控软件开发,需要连接通过OPC连接DCS系统时,需要通过visual studio的NuGet包管理器添加OpcAutomation,如下图所示: 这样便可以实现通过C#连接读取数据。但是在通过C#连接OPC server时,会出现错…

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色,它不仅仅是一项技术手段,更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性,并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

走迷宫之推箱子

前言: 在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台:https://ctfgame.w-ais.cn/ 密文: 下载附件解压,得到两张jpg图片和一个文本文件。 解题思路&#x…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上,进一步使用 b…

【Java】源码文件开头添加注释

需求 应公司质量部要求,需要对代码做静态检查。质量部要求,源码文件必须在起始行起设置一些注释,然而项目已经开发了一年之久,且没有维护这个注释。 此时,面对好几千个源码文件,我们如何快速添加相应的注…