关于python IO模型的笔记

IO模型共有4种,其中三种是同步IO和剩下一个异步IO

常用的三种同步IO是

1 阻塞IO:特点:全程阻塞

由于用户态转内核态,向系统发起数据请求,系统处于等待数据状态(阻塞)当数据来了将数据从内核态拷贝到用户态

常见的阻塞IO是socket的recv请求数据状态,和accept等待链接状态中的暂停状态。

2 非阻塞IO:

其实所谓的非阻塞IO就是把系统等待数据状态变得不再阻塞,而是当你需要数据的时候时不时隔段时间来看看有没有数据,没有则返回error,在socket中就是把系统等待连接的状态改成非阻塞IO时不时查看有没有用户连接

列:

import socket
sock=socket.socket()
sock.bind((ip)poit)
sock.listen(5)
sock.setblicking(False)
while 1:
 try:
  conn,addr=sock.accept()
 except Exception as e:
  print(e)
  time.sleep(3)

系统会重复确定连接状态,没有连接的时候抛出异常

缺点:
1.发送多次系统调用,消耗大
2.数据不是实时的

优点:wait for data的时候无需等待


两个阶段:wait for data 非阻塞
   copy data  阻塞

3 IO多路复用 特点:可以监听多个连接

这个比较重要一般面试的时候一定会问

在socket中如何实现多个用户同时连接,除了socketserver模块外,还可以自己用IO多路复用实现

用select模块来对socket对象进行监听结合setbloking实现同时链接多个客户端

import select
import socket

server=socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)#重复查看客户端有没有连接进入
imports=[server,] #将对象加入列表
while 1:
    r,w,e=select.select(imports,[],[])#select监听列表对象,列表中有活动的对象时候会赋值给r
    print('sever is wroking')
    for obj in r:
        if obj==server:   #如果是socket对象有活动
            conn,addr=obj.accept()#创建客户端连接对象
            imports.append(conn) #将创建号的客户端对象加入列表进行监听是否再次活动
        else:#如果是连接对象有活动
            data=obj.recv(1024)
            print(data.decode('utf8'))
            send_data=input('>>')
            obj.send(send_data.encode('utf8'))

特点: 1 全程(wait for data,copy)
  2 能监听多个文件描述符(soket对象)

4 异步IO:

因为实现过于复杂繁琐,所以我也不知道,待补充

5 驱动信号模型

待补充。。。

原文地址:https://www.cnblogs.com/crischou/p/6836687.html