网络IO模型 非阻塞IO模型
网络IO模型 非阻塞IO模型
-
同步
- 一件事做完后再做另一件事情
-
异步
- 同时做多件事情
- 相对论 多线程 多进程 协程 异步的程序
- 宏观角度:异步 并发聊天
-
阻塞IO
- 阻塞IO的问题
- 一旦阻塞就不能做其他事情了
- 原生socket,默认阻塞IO
- 阻塞IO的问题
-
非阻塞IO模型
-
非阻塞IO问题
- 给CPU造成了很大的负担
-
原生socket setblocking(False)不推荐使用
-
from socket import * import time s=socket(AF_INET,SOCK_STREAM) s.bind(('127.0.0.1',8080)) s.listen(5) s.setblocking(False) #设置socket的接口为非阻塞 conn_l=[] del_l=[] while True: try: conn,addr=s.accept() conn_l.append(conn) except BlockingIOError: print(conn_l) for conn in conn_l: try: data=conn.recv(1024) if not data: del_l.append(conn) continue conn.send(data.upper()) except BlockingIOError: pass except ConnectionResetError: del_l.append(conn) for conn in del_l: conn_l.remove(conn) conn.close() del_l=[] #客户端 from socket import * c=socket(AF_INET,SOCK_STREAM) c.connect(('127.0.0.1',8080)) while True: msg=input('>>: ') if not msg:continue c.send(msg.encode('utf-8')) data=c.recv(1024) print(data.decode('utf-8'))
-
-
永远在就绪和运行之间切换,虽然能够最大限制的利用CPU,但是不排除过度利用的现象
-
-
IO多路复用
- 利用一个操作系统提供给你的代理机制,来帮助你监听网络IO对象的读写时间
-
异步IO 最好
- 等待数据阶段和拷贝数据阶段都不需要用户处理,所有的操作都由操作系统替你完成,拷贝数据阶段,只有异步IO是不需要阻塞的