关于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 驱动信号模型
待补充。。。