IO模型

该篇的IO模型主要针对的是网络IO的,其他IO不在本篇考虑范围之内!

IO模型简介

Stevens在文章中一共比较了五种IO Model,分别为:
    * blocking IO           阻塞IO
    * nonblocking IO      非阻塞IO
    * IO multiplexing      IO多路复用
    * signal driven IO     信号驱动IO
    * asynchronous IO    异步IO
    由signal driven IO(信号驱动IO)在实际中并不常用,所以主要介绍其余四种IO Model。
	
我们常见的io操作有:
同步异步
阻塞非阻塞
常见的网络阻塞状态:
  	accept
    recv
    recvfrom
    send虽然它也有io行为 但是不在我们的考虑范围

IO传输数据时的图解

image

1)等待数据准备 (Waiting for the data to be ready)
2)将数据从内核拷贝到进程中(Copying the data from the kernel to the process)

阻塞IO模型

image

我们之前写的都是阻塞IO模型  协程除外

# 在服务端开设多进程或者多线程 进程池线程池 其实还是没有解决IO问题
该等的地方还是得等 没有规避
只不过多个人等待的彼此互不干扰

非阻塞IO模型

image

虽然非阻塞IO给你的感觉非常的牛逼
但是该模型会 长时间占用着CPU并且不干活 让CPU不停的空转
我们实际应用中也不会考虑使用非阻塞IO模型

IO多路复用

"""
当监管的对象只有一个的时候 其实IO多路复用连阻塞IO都比比不上!!!
但是IO多路复用可以一次性监管很多个对象

server = socket.socket()
conn,addr = server.accept()

监管机制是操作系统本身就有的 如果你想要用该监管机制(select)
需要你导入对应的select模块
"""
import socket
import select


server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)
read_list = [server]


while True:
    r_list, w_list, x_list = select.select(read_list, [], [])
    """
    帮你监管
    一旦有人来了 立刻给你返回对应的监管对象
    """
    # print(res)  # ([<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080)>], [], [])
    # print(server)
    # print(r_list)
    for i in r_list:  #
        """针对不同的对象做不同的处理"""
        if i is server:
            conn, addr = i.accept()
            # 也应该添加到监管的队列中
            read_list.append(conn)
        else:
            res = i.recv(1024)
            if len(res) == 0:
                i.close()
                # 将无效的监管对象 移除
                read_list.remove(i)
                continue
            print(res)
            i.send(b'heiheiheiheihei')

 # 客户端
import socket


client = socket.socket()
client.connect(('127.0.0.1',8080))


while True:

    client.send(b'hello world')
    data = client.recv(1024)
    print(data)

总结

"""
监管机制其实有很多
select机制  windows linux都有

poll机制    只在linux有   poll和select都可以监管多个对象 但是poll监管的数量更多

上述select和poll机制其实都不是很完美 当监管的对象特别多的时候
可能会出现 极其大的延时响应

epoll机制   只在linux有
	它给每一个监管对象都绑定一个回调机制
	一旦有响应 回调机制立刻发起提醒

针对不同的操作系统还需要考虑不同检测机制 书写代码太多繁琐
有一个人能够根据你跑的平台的不同自动帮你选择对应的监管机制
selectors模块
"""

异步IO模型

image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IO模型 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 重构后台的django项目目录、配置开发环境、添加环境变量

    重构项目目录 celery_task: logs:项目运行时/开发时日志目录包 luffapi:项目同名文件夹 apps:项目所有应用的集合文件夹 libs:第三方类库的保存目录[第三方组件、模块] – 包 media:用户提交的文件目录文件夹 settings:配置目录,包含开发时的配置文件和上线时的配置文件 utils:多个模块[子应用]的公共函数类库[…

    2023年4月2日
    00
  • bbs项目前期准备和表设计

    一、前期准备 1.新建一个django项目 2.连接mysql数据库(注意需要在init文件里面书写import pymysql),告诉django使用pymysql连接数据库 3.静态文件路径在settings里配置一下,并且在项目文件夹下新建一个静态文件夹 4.将需要用到bootstrap的css和js文件添加到static文件夹内 二、bbs项目表设计…

    Python开发 2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
  • xadmin的使用

    安装 在项目的虚拟环境下执行 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 注意:xadmin对于不同django版本有不同的版本,一定要使用相对应的版本 在app中注册 INSTALLED_APPS = [ # … # xadmin主体模块 ‘xadmin’, # …

    Python开发 2023年4月2日
    00
  • 注册功能页面的搭建

    思路分析 注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示! 所有我们需要使用forms组件搭建注册页面! 平时我们书写form是组件的时候是在views.py里面书写的,但是为了接耦合,我们需要将forms组件都单独写在一个地方,需要用的时候导入就行! 例如,在项目文件夹下创建一个myforms文件夹,里面放各种forms组件文件…

    2023年4月2日
    00
  • django中的中间件

    1. 什么是中间件 中间件是django的门户,在请求响应进入进出django的时候,都需要先经过中间件,用来全局改变django的输入和输出。 django中自带7个中间件,每个中间件都有其特定的功能,并且django支持自定义中间件。 MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddlewar…

    2023年4月2日
    00
  • django中的路由层

    1.什么是路由层 简单来说,就是通过路由层中的path函数,告诉django遇到那个url,执行那个视图函数 2.路由层的请求流程 1.客户在浏览器输入网址→请求进入django的setting.py中的ROOT_URLCONF寻找指定使用的urls.py文件位置(如果中间件有路由功能,urls文件功能会被其替代) 2.Django会先匹配项目目录下的pat…

    Python开发 2023年4月2日
    00
  • 微信小程序的点击事件、页面跳转、数据绑定、数据修改、获取用户信息及定位、for指令、获取用户上传图片

    小程序中实现页面跳转 对标签绑定点击事件 data是点击时传入的参数 <view bindtap=”clickMe” data-nid=”123″ data-name=”SD” >点我跳转</view> /** * 用户点击事件 */ clickMe(e){ console.log(e) var nid = e.currentTarg…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部