iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python教程:精简概述I/O模型与I/O操作
  • 845
分享到

Python教程:精简概述I/O模型与I/O操作

2023-06-01 23:06:53 845人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python教程:精简概述I/O模型与I/O操作一. I/O 模型1. 特指 linux 下的网络 io,一般分类:阻塞IO(blocking IO)非阻塞IO(non-blocking IO)IO多路复用(IO multiplexing)

python教程:精简概述I/O模型与I/O操作

一. I/O 模型

1. 特指 linux 下的网络 io,一般分类:

  • 阻塞IO(blocking IO)
  • 非阻塞IO(non-blocking IO)
  • IO多路复用(IO multiplexing)
  • 信号驱动IO(signal driven IO)
  • 异步IO(asynchronous IO)

2. 一个网络 I/O 涉及两个系统对象:

  • 应用进程(Process/Thread)
  • 系统内核(Kernel)

3. 一个 read 操作会经历两个阶段:

  • 等待数据就绪(Kernel Waiting for the data to be ready)
  • 拷贝数据到进程(Copying the data from the kernel to the process)

4. 一个 I/O read 操作的执行流程:

1. Process 调用 Kernel 发出请求
   1.1 Kernel 等待数据准备就绪(Waiting)
   1.2 Kernel 拷贝数据到用户空间(Copying)
3. Kernel 通知 Process 拷贝完成
4. Process 接收数据,并进行处理

5. 对应 Pythontcp 通信过程:

1. server 端通过 recv() 调用 Kernel
   1.1 Kernel 等待接收 client 端 send() 数据并加入缓冲区
   1.2 Kernel 将缓冲区数据 copy 到 server 的用户内存空间
2. Kernel copy 完毕之后通知 server
3. server 接收并处理数据

6. 主要四种 I/O 模型的对比及演化:

a. 默认情况下,所有 Socket 接口都是阻塞型IO(blocking IO)
问题:Waiting 阶段、Copying 阶段处于阻塞状态,程序只能处理一个网络连接
解决方案:开启多线程/多进程
   效果:
       每个连接都拥有独立的线程/进程,任一连接阻塞都不会影响其他连接
   问题:
       遇到需要同时响应大量的连接请求,多线程/多进程会严重占据系统资源
改进方案:连接池、线程池
   效果:
       连接池可减少创建/关闭连接的频率,重用已有连接
       线程池可减少创建/销毁线程的频率,维持一定合理数量的线程
   问题:
       “池”始终有上限,当请求数量大大超过上限时,系统响应效率未必更高
b. 轮询检测 Kernel 数据是否就绪,实现非阻塞IO(non-blocking IO)
效果:
   程序能够在等待数据就绪的时间里,去执行其他工作
问题:
   不断循环往复地调用系统将,大幅度推高 CPU 占用率
   人为加入延迟降低循环速度,又会导致数据吞吐量降低
c. 系统提供单一线程即可处理多连接的 select 接口(IO multiplexing)
效果:占用资源少,不会消耗过多 CPU,能够同时为多客户端提供服务
问题:对于单一客户端的连接请求并不能处理得更快,不适用于单个连接
d. Python 通过 asyncio 模块实现了异步IO模型(asynchronous IO)
异步IO下的执行流程:
   1. Process 调用 Kernel 发出请求,立刻去做其他事务
   2. Kernel 先立刻返回应答给 Process
   3. Kernel 再准备数据(Waiting)
   4. Kernel 拷贝到数据到用户空间(Copying)
   5. Kernel 完成数据拷贝,发 Signal 到 Process
   6. Process 回来继续该 IO 操作

7. 主要四种 IO 模型总结

  • blocking IO:在 Waiting 阶段、Copying 阶段都会阻塞
  • non-blocking IO:在 Waiting 阶段不阻塞,但是监听由应用程序发起,必须不断调用操作系统
  • IO multiplexing:应用程序本身不阻塞,但 select 会阻塞,应用程序仍需定期查询 select
  • asynchronous IO:在 Waiting 阶段、Copying 阶段都不会阻塞

二. IO 操作

1. 同步I/O操作(synchronous I/O operation)

  • I/O操作过程中,存在请求进程阻塞的阶段
  • I/O模型包括:blocking IO、non-blocking IO、IO multiplexing

2. 异步I/O操作(asynchronous I/O operation)

  • 整个I/O操作完成,请求进程都不会阻塞
  • IO模型包括:asynchronous IO


更多的Python学习教程下期继续更新!

这里有整理视频教程,刚好在学习的伙伴,可以回复:Python教程,领取!

Python 900集全套视频教程(全家桶)https://pan.baidu.com/s/1cU5lDWq9gh0cQ7hCnXUiGA 提取:

--结束END--

本文标题: Python教程:精简概述I/O模型与I/O操作

本文链接: https://www.lsjlt.com/news/228000.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作