• 计算机常见I/O操作介绍、I/O操作优化提升程序性能方法(异步I/O、多线程和多进程、非阻塞I/O、I/O多路复用)


    计算机I/O操作介绍

    计算机I/O操作,或称为输入/输出操作,是计算机程序与外部环境之间交互的一种方式。这个过程包括各种类型,如文件读写、数据库查询、网络通信、设备交互等。

    一、文件读写

    文件读写是最常见的I/O操作之一。它涉及打开一个文件,读取内容,或者向文件中写入内容。例如,在Python中,我们可以使用内置的open函数进行文件的读写操作:

    # 打开一个文件并读取内容
    with open('example.txt', 'r') as file:
        content = file.read()
        print(content)
    
    # 向文件中写入内容
    with open('example.txt', 'w') as file:
        file.write('Hello, World!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    文件I/O操作通常是阻塞的,这意味着在读取或写入数据时,程序必须等待操作完成才能继续执行其他任务。1

    二、数据库查询

    数据库查询也是一种I/O操作,比如执行SQL语句,读取或修改数据库中的数据。在Python中,我们可以使用sqlite3库来操作SQLite数据库:

    import sqlite3
    
    # 连接到SQLite数据库
    conn = sqlite3.connect('example.db')
    
    # 创建一个Cursor对象并执行SQL查询
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    
    # 获取查询结果
    results = cursor.fetchall()
    
    # 关闭连接
    conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里的数据库查询也是一种阻塞操作,即在获取查询结果之前,程序必须等待数据库服务器的响应。2

    三、网络通信

    网络通信,比如调用HTTP接口或使用TCP/IP协议发送和接收数据,都属于I/O操作。例如,我们可以使用Python的requests库来发出HTTP请求:

    import requests
    
    # 发出GET请求
    response = requests.get('https://www.example.com')
    
    # 输出响应内容
    print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在网络通信中,客户端需要向服务器发送请求并等待响应,这个过程通常也是阻塞的。3

    四、设备交互

    设备交互,比如从键盘读取输入,向屏幕输出信息,或者通过USB接口与设备交互,也可以看作是I/O操作。例如,我们可以使用Python的input函数从键盘读取用户输入:

    # 从键盘读取用户输入
    user_input = input('Please enter something: ')
    
    # 输出用户输入
    print('You entered:', user_input)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    五、消息队列

    在分布式系统中,服务间的通信常常通过消息队列完成,这也是一种I/O操作。例如,我们可以使用RabbitMQ作为消息代理,通过Python的pika库来发布和接收消息4

    import pika
    
    # 连接到RabbitMQ服务器
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    
    # 声明一个队列
    channel.queue_declare(queue='hello')
    
    # 发布消息
    channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
    
    print(" [x] Sent 'Hello World!'")
    connection.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    六、RPC调用

    远程过程调用(RPC)也是一种I/O操作,客户端会将请求及其参数发送给服务器,等待并接收结果。例如,我们可以使用gRPC框架来实现RPC调用5

    from grpc import insecure_channel
    
    # 创建一个gRPC通道
    channel = insecure_channel('localhost:50051')
    
    # 创建一个客户端存根
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    
    # 发起RPC调用并获取结果
    response = stub.SayHello(helloworld_pb2.HelloRequest(name='world'))
    
    # 输出结果
    print("Greeter client received: " + response.message)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上就是计算机I/O操作的一些常见形式。理解这些基础概念对于编写高效、可靠的程序至关重要。由于I/O操作通常是阻塞的,并且可能会花费较长的时间,因此在设计和实现程序时,我们需要考虑如何最好地处理I/O操作,以避免影响程序的性能。

    如何优化I/O操作以提升程序性能

    当我们讨论如何处理I/O操作以提升程序性能时,有几种主要的方法和技术可以帮助我们实现这一目标。

    一、异步I/O

    异步I/O是一种处理I/O操作的方法,它允许程序在等待I/O操作完成时执行其他任务。异步I/O通过使用事件循环和回调函数来管理I/O操作,当I/O操作完成时,相关的回调函数会被调用。

    例如,在Python中,我们可以使用asyncio库来执行异步I/O操作6

    import asyncio
    
    async def main():
        # 执行异步I/O操作
        await asyncio.sleep(1)
        print('Hello, World!')
    
    # 运行事件循环
    asyncio.run(main())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、多线程和多进程

    多线程和多进程是另外两种处理I/O操作的方法。在多线程模型中,每个线程都可以独立地执行任务,并在等待I/O操作完成时释放CPU,使其可以被其他线程使用。在多进程模型中,每个进程都拥有自己的内存空间和I/O设备,可以并行地执行任务。

    例如,在Python中,我们可以使用threading库来创建多个线程7

    import threading
    
    def worker():
        # 在新线程中执行任务
        print('Hello, World!')
    
    # 创建并启动新线程
    thread = threading.Thread(target=worker)
    thread.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、非阻塞I/O

    非阻塞I/O是一种特殊的I/O模式,它允许程序在I/O操作未完成时立即返回。这样,程序可以继续执行其他任务,而不必等待I/O操作的完成。

    例如,在Python中,我们可以使用socket库来创建一个非阻塞的套接字8

    import socket
    
    # 创建一个非阻塞的套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(False)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、I/O多路复用

    I/O多路复用是一种技术,它允许一个进程监视多个I/O操作,当其中任何一个操作准备好进行读写时,都能立即得到通知。常见的I/O多路复用技术有select,poll和epoll等。

    例如,在Python中,我们可以使用selectors库来实现I/O多路复用9

    import selectors
    import socket
    
    # 创建一个默认的选择器
    sel = selectors.DefaultSelector()
    
    # 创建一个非阻塞的套接字并注册到选择器
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(False)
    sel.register(sock, selectors.EVENT_READ)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    以上就是一些处理I/O操作以提升程序性能的主要方法。每种方法都有其优点和适用场景,因此在选择合适的方法时,我们需要根据程序的具体需求和环境来做出决定。


    1. Python file I/O ↩︎

    2. Python SQLite tutorial ↩︎

    3. Python requests tutorial ↩︎

    4. RabbitMQ tutorials ↩︎

    5. gRPC Python quickstart ↩︎

    6. Python asyncio tutorial ↩︎

    7. Python threading tutorial ↩︎

    8. Python socket programming guide ↩︎

    9. Python selectors documentation ↩︎

  • 相关阅读:
    云原生中间件RocketMQ-消费者核心参数、消费模式之集群模式
    MySQL-创建用户、赋权限
    layui--记录
    基于BP-Adaboost神经网络的高斯函数模型预测研究-含Matlab代码
    计算机毕业设计之java+javaweb的大学运动场地管理系统
    第一次笔记:计算机硬件的工作原理 主存储器 运算器 控制器 计算机的工作过程 计算机系统的层次结构 三种级别的语言
    SEO外语网站批量翻译软件
    金仓数据库 KDTS 迁移工具使用指南(2. 简介)
    基于SpringBoot+vue的文件管理系统
    Postman使用简介
  • 原文地址:https://blog.csdn.net/Dontla/article/details/133135462