zoukankan      html  css  js  c++  java
  • 第三十三章 io模型、非阻塞、多路复用

    IO模型

    模型就是解决某个问题的套路

    IO问题:

    输入输出

    我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等

    将当前进程阻塞住,切换至其他进程执行,等到按下回车键,拿到了一个用户名,再唤醒刚才的进程,将状态调整为就绪态

     

    以上处理方案 就称之为阻塞IO模型

     

    存在的问题:

    当执行到recv时,如果对象并没有发送数据,程序阻塞了,无法执行其他任务

    解决方案:

    多线程或多进程,

    当客户端并发量非常大的时候,服务器可能就无法开启新的线程或进程,如果不对数量加以限制 服务器就崩溃了

    线程池或进程池

    首先限制了数量 保证服务器正常运行,但是问题是,如果客户端都处于阻塞状态,这些线程也阻塞了

    协程:

    使用一个线程处理所有客户端,当一个客户端处于阻塞状态时可以切换至其他客户端任务

     

    非阻塞IO模型

    阻塞IO模型在执行recv 和 accept 时 都需要经历wait_data

    非阻塞IO即 在执行recv 和accept时 不会阻塞 可以继续往下执行

     

    如何使用:

    将server的blocking设置为False 即设置非阻塞

     

    存在的问题 :

    这样一来 你的进程 效率 非常高 没有任何的阻塞

    很多情况下 并没有数据需要处理,但是我们的进程也需要不停的询问操作系统 会导致CPU占用过高

    而且是无意义的占用

    案例:

    import socket
    import time

    server = socket.socket()
    server.bind(("192.168.13.103",1688))
    server.listen()
    server.setblocking(False) # 默认为阻塞   设置为False 表示非阻塞

    # 用来存储客户端的列表
    clients = []

    # 链接客户端的循环
    while True:
       try:
           client,addr = server.accept()   # 接受三次握手信息
           # print("来了一个客户端了.... %s" % addr[1])
           # 有人链接成功了
           clients.append(client)
       except BlockingIOError as e:
           # print("还没有人连过来.....")
           # time.sleep(0.5)
           # 服务你的客人去
           for c in clients[:]:
               try: # 可能这个客户端还没有数据过来
                   # 开始通讯任务
                   data = c.recv(2048)
                   c.send(data.upper())
               except BlockingIOError as e:
                   print("这个客户端还不需要处理.....",)

               except ConnectionResetError:
                   # 断开后删除这个客户端
                   clients.remove(c)
           print("=======================",len(clients))

     

  • 相关阅读:
    记录:将图片数据生成 tfrecords 文件并在训练使用时读取
    记录:EM 算法估计混合高斯模型参数
    记录:Ubuntu 18.04 安装 tensorflow-gpu 版本
    记录:tf.saved_model 模块的简单使用(TensorFlow 模型存储与恢复)
    记录:TensorFlow 中的 padding 方式
    mybatis list映射
    idea使用插件mybatis-generator-plus生成mapper文件(mysql亲测可用)
    Element-UI树形表格
    Mysql5.7版本ERROR 1055问题
    为DISTINCT、GROUP BY和ORDER BY效率问题提提速
  • 原文地址:https://www.cnblogs.com/sry622/p/11006476.html
Copyright © 2011-2022 走看看