IO 模型--非阻塞IO--day37

"""
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   ???

"""
posted @ 2019-01-05 18:50  WenChen-0o0  阅读(126)  评论(0编辑  收藏  举报