IO模型

阻塞IO

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

非阻塞IO

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

IO多路复用

使用python内置模块select实现socket IO多路复用:

  • Server
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!')

  • Client
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数据都是操作系统的事
原文地址:https://www.cnblogs.com/wualin/p/9968433.html