一、IO模型介绍
1、阻塞与非阻塞指的是程序的两种运行状态
阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源
非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO操作也不会停在原地,执行其他操作,力求尽可能多的占有CPU
2、同步与异步指的是提交任务的两种方式:
同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码
异步调用:当进程执行到一个IO(等待外部数据)的时候,不需要等待,待数据接收成功后,再回来处理。
二、阻塞IO模型
默认情况下,所有的socket都是blocking模型,
实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。
这给网络编程带来了一个很大的问题,如在调用recv(1024)的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。
blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。
三、非阻塞IO模型
在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind((‘127.0.0.1‘,8083)) server.listen(5) server.setblocking(False) print(‘starting...‘) rlist=[] wlist=[] while True: try: conn, addr = server.accept() rlist.append(conn) print(rlist) except BlockingIOError: # print(‘干其他的活‘) #收消息 del_rlist = [] for conn in rlist: try: data=conn.recv(1024) if not data: del_rlist.append(conn) continue wlist.append((conn,data.upper())) except BlockingIOError: continue except Exception: conn.close() del_rlist.append(conn) #发消息 del_wlist=[] for item in wlist: try: conn=item[0] data=item[1] conn.send(data) del_wlist.append(item) except BlockingIOError: pass for item in del_wlist: wlist.remove(item) for conn in del_rlist: rlist.remove(conn) server.close()
四、多路复用IO模型
五、异步IO模型
六、各种IO模型对比
七、了解selectors模块的使用
原文地址:https://www.cnblogs.com/foremostxl/p/9738068.html
时间: 2024-10-08 12:08:41