阻塞IO

- 阻塞等待接收数据后从操作系统内存copy到应用程序内存
非阻塞IO

- 循环去询问操作系统是否接收到了数据
- 单线程下实现了并发,但过于消耗系统资源
IO多路复用

使用python内置模块select实现socket IO多路复用:
import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen(5)
read_lst = [sk]
while True:
r_lst,w_lst,x_lst = select.select(read_lst,[],[])
for i in r_lst:
if i is sk:
conn,addr = i.accept()
read_lst.append(conn)
else:
ret = i.recv(1024)
if ret == b'':
i.close()
read_lst.remove(i)
continue
print(ret)
i.send(b'goodbye!')
import socket
import time
from threading import Thread
def func():
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
time.sleep(3)
print(sk.recv(1024))
if __name__ == '__main__':
for i in range(20):
t = Thread(target=func)
t.start()
IO多路复用机制
- select机制:windows ,liunx
- poll 机制 :liunx 可监听的对象比select机制可以监听的多
- select与poll机制都是操作题哦那个循环每一个监听的项,看看是否有读操作,随着监听项增多,导致效率低下
- epoll 机制:liunx,MacOS
- selectors模块:自动选择合适的机制
异步IO

- 程序给操作系统发送一个信号,操作系统等待收到信息,收到信息后从操作系统内存拷贝到应用程序内存,在操作系统等待的这时间里,应用程序在做其他的事,等待数据与copy数据都是操作系统的事