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

发布时间:2024年01月15日

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

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

文章来源:https://blog.csdn.net/wuShiJingZuo/article/details/135591801
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。