"""
IO 模型
什么是IO 指的是输入输出,其执行速度都非常慢
模型,指固定的套路
IO模型 就是 所有可以实现输入输出的套路
IO的分类
1.本地IO 指的是输入输出到本地计算机 比如写入硬盘
2.网络IO 指的是输入输出到 网络中的计算机 速度远比本地IO慢(*****)
网络IO的输入输出过程
IO模型(******):
1.阻塞型IO
之前学习的IO操作处理gevent都是阻塞型的
1.可以利用多线程来提高效率
线程数量不能太多 会造成内存溢出
2.线程池可以解决线程太多的问题
但是如果线程池数量达到最大 其他客户端将进入等待
3.在单线程并发的来处理 可以使单核下的效率最高
2.非阻塞IO
# ----非阻塞IO-----
import socket, time
from time import sleep
server = socket.socket()
server.bind(("127.0.0.1", 21211))
server.listen()
server.setblocking(False)
# 保存所有的客户端
clients = []
# 需要发送的数据
msg_ls = []
while True:
# 需要接收三次握手数据 所以也是一个阻塞 必须经历wait 和 copy
try:
client, addr = server.accept()
print("来了一个客户端....")
# 每次执行到这个代码的时候 client的值都是一个新的值 则意味只能处理本次的新的客户端
# while True:
# client.send(client.recv(1024).upper())
clients.append(client)
except BlockingIOError:
# sleep(0.1) #
print("还没有数据可以处理 那就干别的事情去")
# 执行except 说明服务器没有请求可以处理 可以去处理客户端通讯
# 已经关闭的 需要删除的客户端
close_ls = []
# 接收数据的循环
for c in clients:
try:
data = c.recv(1024)
if not data:
c.close()
close_ls.append(c)
continue
# 不能直接发 因为操作系统缓存如果满了 会抛异常
# c.send(data.upper())
msg_ls.append((c, data))
except BlockingIOError:
pass
except ConnectionResetError:
c.close()
close_ls.append(c)
# 遍历完成后 删除关闭的连接
for i in close_ls:
clients.remove(i)
close_ls.clear()
# 发送数据的循环
# 保存已经发送过的数据
rm_msg = []
for i in msg_ls:
try:
i[0].send(i[1].upper())
rm_msg.append(i)
print("发送成功!")
except BlockingIOError:
print("发送失败!")
# 清理已经发送过的数据!
for msg in rm_msg:
msg_ls.remove(msg)
rm_msg.clear()
4.异步IO ???
"""